{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas是一个强大的分析结构化数据的工具集；它的使用基础是Numpy（提供高性能的矩阵运算）；用于数据挖掘和数据分析，同时也提供数据清洗功能。本文将从以下方面对Pandas的用法进行介绍：\n",
    "\n",
    "一、 pandas主要结构\n",
    " * series\n",
    " * dataframe\n",
    " \n",
    "二、 pandas索引使用\n",
    "* 索引与取数\n",
    "* 重建索引\n",
    "\n",
    "三、 pandas统计基本功能\n",
    "* 描述性统计\n",
    "* 函数应用\n",
    "* 数据运算\n",
    "* pandas分组与聚合\n",
    "* pandas排序\n",
    "* pandas合并/连接\n",
    "* pandas迭代\n",
    "* pandas字符串和文本数据\n",
    "\n",
    "四、 pandas缺数数据处理\n",
    "\n",
    "五、 pandas2新功能"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. pandas主要结构"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.1 Series\n",
    "系列(Series)是能够保存任何类型的数据(整数，字符串，浮点数，Python对象等)的一维标记数组。轴标签统称为索引。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1.1 创建Series"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pandas.Series(data,index,dtype,copy)\n",
    "- data:数据采取各种形式，如：ndarray,list,constants\n",
    "- index:索引值必须是唯一的和散列的，与数据的长度相同。如果没有所有被传递，默认np.arange(n)\n",
    "- dtype:用于数据类型。如果没有，将推断数据类型\n",
    "- copy:复制数据，默认为false"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以使用各种输入创建一个系列，如：数组、字典、标量值或常数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Series([], dtype: float64)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 创建一个空的Series\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "s = pd.Series()\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    a\n",
       "1    b\n",
       "2    c\n",
       "3    d\n",
       "dtype: object"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从ndarray创建一个Series\n",
    "data = np.array(['a','b','c','d'])\n",
    "s = pd.Series(data)\n",
    "s  # 这里没有传递任何索引，因此默认情况下，分配了从0到len(data)-1的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100    a\n",
       "101    b\n",
       "102    c\n",
       "103    d\n",
       "dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = np.array(['a','b','c','d'])\n",
    "s = pd.Series(data,index=[100,101,102,103])\n",
    "s  # 这里传递了索引值。现在可以在输出中看到自定义的索引值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.0\n",
       "b    1.0\n",
       "c    2.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从字典中创建一个Series\n",
    "data = {'a':0.,'b':1.,'c':2.}\n",
    "s = pd.Series(data)   # 注意，字典键用于构建索引\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b    1.0\n",
       "c    2.0\n",
       "d    NaN\n",
       "a    0.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = {'a':0.,'b':1.,'c':2.}\n",
    "s = pd.Series(data,index=['b','c','d','a'])  # 索引顺序保持不变，缺少的元素使用NaN（不是数字）填充\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    5\n",
       "1    5\n",
       "2    5\n",
       "3    5\n",
       "dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从标量创建一个Series\n",
    "s = pd.Series(5,index=[0,1,2,3])\n",
    "s"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1.2 访问数据\n",
    "系列（Series）中的数据可以使用类似于访问ndarray中的数据来访问。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "a    1\n",
      "b    2\n",
      "c    3\n",
      "dtype: int64\n",
      "c    3\n",
      "d    4\n",
      "e    5\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 从具有位置的Series中访问数据\n",
    "s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])\n",
    "print(s[0])  # 检索第一个元素\n",
    "print(s[:3]) # 检索Series中前三个元素\n",
    "print(s[-3:]) # 检索最后三个元素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "a    1\n",
      "b    2\n",
      "c    3\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 使用标签检索数据\n",
    "# 一个Series就像一个固定大小的字典，可以通过索引标签获取和设置值\n",
    "\n",
    "s = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])\n",
    "print(s['a'])  # 使用索引标签值检索单个元素\n",
    "print(s[['a','b','c']]) # 使用索引标签值检索多个元素\n",
    "\n",
    "# 注意，如果索引不存在的标签，则会报错"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1.3 Series 基本功能"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAucAAAFjCAYAAACezqWbAAAgAElEQVR4Aey9AWwU17n2/zghaS43UdTQGDckvjbBEoIr4ptsclMbpSpgkJx0XV3lqyjFFrFRpehiL1LL/SsFjLBD0ffRSqxxFekTdpDt0ihfdHXtJpaMiatE2E2bJd2gxkIiwb5OSW2nToWSS9tA4r/eM3NmZ2Zn17PeXbNrPyvBzpw55z3n/GY8+5x33nOmYHZ2dhb8kAAJkAAJkAAJkAAJkAAJ3HQCt9z0FrABJEACJEACJEACJEACJEACigDFOS8EEiABEiABEiABEiABEsgRAhTnOXIi2AwSIAESIAESIAESIAESoDjnNUACJEACJEACJEACJEACOUKA4jxHTgSbQQIkQAIkQAIkQAIkQAIU57wGSIAESIAESIAESIAESCBHCFCc58iJYDNIgARIgARIgARIgARIgOKc1wAJkAAJkAAJkAAJkAAJ5AgBivMcORFsBgmQAAmQAAmQAAmQAAlQnPMaIAESIAESIAESIAESIIEcIUBxniMngs0gARIgARIgARIgARIggWVzIbh8+fJcWXicBEiABEiABEiABEiABEggBQKrV6/2zD2nOJdS999/v2dhJs6fwB//+EdynT8+lkyTAK+/NAGyOAmQAAmQAAmkQUB+hxN9GNaSiAzTSYAESIAESIAESIAESGCBCVCcLzBwVkcCJEACJEACJEACJEACiQhQnCciw3QSIAESIAESIAESIAESWGACFOcLDJzVkQAJkAAJkAAJkAAJkEAiAhTnicgwnQRIgARIgARIgARIgAQWmADF+QIDZ3UkQAIkQAIkQAIkQAIkkIgAxXkiMkwnARIgARIgARIgARIggQUmQHG+wMBZHQmQAAmQAAmQAAmQAAkkIkBxnogM00mABEiABEiABEiABEhggQlQnC8wcFZHAiRAAiRAAiRAAiRAAokIUJwnIsN0EiABEiABEiABEiABElhgArktzt99ARUVP8Svpu1U3sWJiidRUfEC/mBPtm3PvPZDVKg8ki/Jv5+/ayvFTV8Epl/Fj5IxdR370WtTlll9Xk6Y2P/wczk3cn6n8KsfJj+nlhG9odvxw1cxA6O8vS6dLfat63gSyfIZbfS+tmLtjVnlFgmQAAmkT0Dfn2z3Hn2PM3+njHuT1++hO81oTex+5ef+mH4P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Av4J0LXpn1VO5TSEL8VvTp0UNoYESIAESIAESIAE0iRAz3maAFmcBEiABEiABEiABEiABDJFgOI8UyRphwRIgARIgARIgARIgATSJEBxniZAFicBEiABEiABEiABEiCBTBGgOM8USdohARIgARIgARIgARIggTQJUJynCZDFSYAESIAESIAESIAESCBTBCjOM0WSdkiABEiABEiABEiABEggTQIU52kCZHESIAESIAESIAESIAESyBQBivNMkaQdEiABEiABEiABEiABEkiTQMHs7OxsMhuXL19OdpjHSIAESIAESIAESIAESIAEUiSwevVqzxK+3hCaqLCnRSb6IiCDHnL1hYqZskCA118WoNIkCZAACZAACfgkkMz5zbAWnxCZjQRIgARIgARIgARIgASyTYDiPNuEaZ8ESIAESIAESIAESIAEfBKgOPcJitlIgARIgARIgARIgARIINsEKM6zTZj2SYAESIAESIAESIAESMAnAYpzn6CYjQRIgARIgARIgARIgASyTYDiPNuEaZ8ESIAESIAESIAESIAEfBKgOPcJitlIgARIgARIgARIgARIINsEKM6zTZj2SYAESIAESIAESIAESMAnAYpzn6CYjQRIgARIgARIgARIgASyTcDXG0Kz3QjaT53Ajb99ji9v3ABmZ1MvnMslCgpwy7JlWHbH7bncSraNBDwJLNq/S8/e2hL5d2uDwU0SIAESSI8APefp8bsppZUAuH598QlzoTk7iy+vX4f0kR8SyCcCi/rvcq4Twb/buQjxOAmQAAn4JpAlz/kkeptq0TpitqOiEQNtQazw3SxmTEZAecyTZVgEx4w+0nueU6cy2o7AmxsRaSq3mjXTF8K2s5vn//c93YdQ9QkMi8W6Y4ZtqWd3r1WHe2PnyUHs1U1Q5SfQENmDDVbGKI4HXkRpfxg1hQA82m1l1Rti53mg2bpPyT3sKHDAtKHzJfleCn+XSbqvDnn/3fpkaZ33dTiozp2cx33omatS63gNOh3XgXWAGyRAAiSQVwSyIM4NYT60pRuRtqK8gpE3jc1aKMt7uPjIEVxTIMpwd/9hPLjyJlHJWh9vUn8WYbVKmLeMAhjFtsAJWw+1uAIutFWhvst2yL0pA/fIoHPgXr4HkcgelVPKDz1hE+OSKkI64BbkNsPRc+ip2IwBEeaYRG9nL3bWG/ZsuZybhUE0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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基本功能如下所示：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[RangeIndex(start=0, stop=4, step=1)]\n",
      "False\n",
      "1\n",
      "4\n",
      "[ 0.9376181  -0.15342991 -1.85860809 -0.9484854 ]\n"
     ]
    }
   ],
   "source": [
    "s = pd.Series(np.random.randn(4))\n",
    "print(s.axes) # 返回Series的标签列表\n",
    "print(s.empty) # 返回布尔值，表示对象是否为空\n",
    "print(s.ndim) # 返回对象的维数\n",
    "print(s.size) # 返回Series的大小\n",
    "print(s.values) # 以数组形式返回Series中的实际数据值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.937618\n",
       "1   -0.153430\n",
       "dtype: float64"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.head(2) # 显示前2行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2   -1.858608\n",
       "3   -0.948485\n",
       "dtype: float64"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.tail(2) # 返回最后2行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 DataFrame\n",
    "数据帧(DataFrame)是二维数据结构，即数据以行和列的表格方式排列。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据帧(DataFrame)的功能特点:\n",
    "- 潜在的列是不同的类型\n",
    "- 大小可变\n",
    "- 标记轴（行和列）\n",
    "- 可以对行和列执行算术运算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2.1 DataFrame创建"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pandas.DataFrame(data,index,columns,dtype,copy)\n",
    "- data: 数据采用各种形式，如:ndarray,series,map,lists,dict,constant和另一个DataFrame\n",
    "- index:对于行标签，要用于结果帧的索引是可选缺省值,如果没有传递，默认为np.arange(n)\n",
    "- columns:列标签，如果没有传入索引，则默认np.arange(n)\n",
    "- dtype:每列的数据类型\n",
    "- copy:默认值为False，则此命令用于复制数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DataFrame可以使用各种输入创建，如：列表、字典、Series、ndarrays、另一个DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: []\n",
       "Index: []"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 创建一个空的DataFrame\n",
    "df = pd.DataFrame()\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   0\n",
       "0  1\n",
       "1  2\n",
       "2  3\n",
       "3  4\n",
       "4  5"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从列表创建DataFrame\n",
    "data = [1,2,3,4,5]\n",
    "df = pd.DataFrame(data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Alex</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Bob</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Clarke</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Name  Age\n",
       "0    Alex   10\n",
       "1     Bob   12\n",
       "2  Clarke   13"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = [['Alex',10],['Bob',12],['Clarke',13]]   # 传入多个列表来创建DataFrame\n",
    "df = pd.DataFrame(data,columns=['Name','Age'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Alex</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Bob</td>\n",
       "      <td>12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Clarke</td>\n",
       "      <td>13.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Name   Age\n",
       "0    Alex  10.0\n",
       "1     Bob  12.0\n",
       "2  Clarke  13.0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = [['Alex',10],['Bob',12],['Clarke',13]]\n",
    "df = pd.DataFrame(data,columns=['Name','Age'],dtype = float) #dtype将Age列的类型更改为浮点\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Tom</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jack</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Steve</td>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>42</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Name  Age\n",
       "0    Tom   28\n",
       "1   Jack   34\n",
       "2  Steve   29\n",
       "3  Ricky   42"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从ndarrays/Lists的字典来创建DataFrame\n",
    "# 所有的ndarrays必须具有相同的长度。如果传递了索引（index），则索引的长度应等于数组的长度。\n",
    "\n",
    "data = {'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}\n",
    "df = pd.DataFrame(data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>rank1</th>\n",
       "      <td>Tom</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rank2</th>\n",
       "      <td>Jack</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rank3</th>\n",
       "      <td>Steve</td>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rank4</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>42</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Name  Age\n",
       "rank1    Tom   28\n",
       "rank2   Jack   34\n",
       "rank3  Steve   29\n",
       "rank4  Ricky   42"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = {'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}\n",
    "df = pd.DataFrame(data,index=['rank1','rank2','rank3','rank4'])  # 通过index参数，设置index的名字\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "      <th>c</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>10</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   a   b     c\n",
       "0  1   2   NaN\n",
       "1  5  10  20.0"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从列表创建DataFrame\n",
    "data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]\n",
    "df = pd.DataFrame(data) # NaN附加在缺失的区域\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3.0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two\n",
       "a  1.0    1\n",
       "b  2.0    2\n",
       "c  3.0    3\n",
       "d  NaN    4"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从Series的字典来创建DataFrame\n",
    "d = {'one':pd.Series([1,2,3],index=['a','b','c']),\n",
    "     'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}\n",
    "\n",
    "df = pd.DataFrame(d)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2.2 列、行相关操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### （1）列选择\n",
    "从数据帧(DataFrame)中选择一列。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    2.0\n",
       "c    3.0\n",
       "d    NaN\n",
       "Name: one, dtype: float64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['one']  # 查询某一列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3.0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two\n",
       "a  1.0    1\n",
       "b  2.0    2\n",
       "c  3.0    3\n",
       "d  NaN    4"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['one','two']]  # 查询多列"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### （2） 列添加\n",
    "向现有数据框添加一个新列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>10.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>20.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3.0</td>\n",
       "      <td>3</td>\n",
       "      <td>30.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two  three  four\n",
       "a  1.0    1   10.0   2.0\n",
       "b  2.0    2   20.0   4.0\n",
       "c  3.0    3   30.0   6.0\n",
       "d  NaN    4    NaN   NaN"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 向现有数据框添加一个新列\n",
    "df['three'] = pd.Series([10,20,30],index=['a','b','c'])\n",
    "df['four'] = df['one'] + df['two']  # 观测结果发现，NAN与其他常数相加的结果还是为NaN\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### （3）列删除\n",
    "列可以删除或弹出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1</td>\n",
       "      <td>10.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>2</td>\n",
       "      <td>20.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3</td>\n",
       "      <td>30.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   two  three  four\n",
       "a    1   10.0   2.0\n",
       "b    2   20.0   4.0\n",
       "c    3   30.0   6.0\n",
       "d    4    NaN   NaN"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除one列\n",
    "del df['one']\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   three  four\n",
       "a   10.0   2.0\n",
       "b   20.0   4.0\n",
       "c   30.0   6.0\n",
       "d    NaN   NaN"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 弹出two列\n",
    "df.pop('two')\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### （4）行选择，添加和删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "one    2.0\n",
       "two    2.0\n",
       "Name: b, dtype: float64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 标签选择loc\n",
    "# 通过将行标签传递给loc()函数来选择行\n",
    "d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), \n",
    "     'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}\n",
    "\n",
    "df = pd.DataFrame(d)\n",
    "df.loc['b']  # 查询index为b的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "one    3.0\n",
       "two    3.0\n",
       "Name: c, dtype: float64"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按整数位置选择\n",
    "# 通过将整数位置传递给iloc()函数来选择行\n",
    "df.iloc[2]  # 查询第3行信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>3.0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two\n",
       "c  3.0    3\n",
       "d  NaN    4"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 行切片\n",
    "# 可以使用:运算符选择多行\n",
    "df[2:4] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   a  b\n",
       "0  1  2\n",
       "1  3  4\n",
       "0  5  6\n",
       "1  7  8"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 附加行\n",
    "# 使用append()函数将新行添加到DataFrame\n",
    "df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])\n",
    "df2 = pd.DataFrame([[5, 6],[7, 8]],columns=['a','b'])\n",
    "df = df.append(df2)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   a  b\n",
       "1  3  4\n",
       "1  7  8"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除行\n",
    "# 使用索引标签从DataFrame中删除或删除行。 如果标签重复，则会删除多行。\n",
    "df = df.drop(0) # 删除标签为0的行\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2.3 DataFrame基本功能"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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cDsLeg6oRctBQBhGAiRAAiSQNQK0nM8B5dW/fYGvrl7NnQV9DjJlJUtREeSFvOSWm7NSXDqFJBs5ppOfaUhgoQjwObBQ5FkvCZAACeQ/gWT6T6GZSOelt7TyOn8K7Lw0ipWQAAlkRIDPgYxwMTEJkAAJkECaBLK8lWKatTIZCZAACZAACZAACZAACZBAAgEq5wlIGEACJEACJEACJEACJEACC0OAyvnCcGetJEACJEACJEACJEACJJBAgMp5AhIGkAAJkAAJkAAJkAAJkMDCEKByvjDcWSsJkAAJkAAJkAAJkAAJJBCgcp6AhAEkQAIkQAIkQAIkQAIksDAEqJwvDHfWSgIkQAIkQAIkQAIkQAIJBKicJyBhAAmQAAmQAAmQAAmQAAksDIG0vhC6MKKxVhIgARIgARIgARIgARIoTAIrVqwIbFhaXwgNyxxYYh4EJvtkah6IX1Aisi8KqjvZGBIgARIgARIggTQIiP4T9ke3ljAyDCcBEiABEiABEiABEiCBeSZA5XyegbM6EiABEiABEiABEiABEggjQOU8jAzDSYAESIAESIAESIAESGCeCVA5n2fgrI4ESIAESIAESIAESIAEwghQOQ8jw3ASIAESIAESIAESIAESmGcCVM7nGTirIwESIAESIAESIAESIIEwAlTOw8gwnARIgARIgARIgARIgATmmQCV83kGzupIgARIgARIgARIgARIIIwAlfMwMgwnARIgARIgARIgARIggXkmkNYXQudZpkVf3dW/fYGvrl4FZmcXvawJAhYV4YYlS7DklpsTohiQmkBe933q5oWn4HUTzoYxBUlgUd/rvB8L8pqb70Zd0zXOazCn3UXLeYZ41cV85Up+KubS1tlZfHXlCqQd/MuMQN73fWbN9abmdePlwbOCJrDo73XejwV9/c1H4675Guc1mNNuyq3lfKwbkW392Hx4CDsqc9qOeStcWcznrbbcVaTbkZ/W85mBKDrwDGJ1JekDmh5AtLYLIylzrEbbYAz1xYkJC6XvE1uWfkj6180YDkV2AnO498921qCpL7wflLTSn88C7Z11WKoCptDfegDYHdx34S1MT0655jZ1nFPF6OeZzncsvGBXTD1649uxxhViH6a8Lh0Obhns/AEHzvPWJWNVC47brAIypREUWn/jQcRb3Q946YsGjDfp535696sja3X7UXVv6+sg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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基本功能如下所示：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Tom</td>\n",
       "      <td>25</td>\n",
       "      <td>4.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>James</td>\n",
       "      <td>26</td>\n",
       "      <td>3.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>25</td>\n",
       "      <td>3.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Vin</td>\n",
       "      <td>23</td>\n",
       "      <td>2.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Steve</td>\n",
       "      <td>30</td>\n",
       "      <td>3.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Minsu</td>\n",
       "      <td>29</td>\n",
       "      <td>4.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Jack</td>\n",
       "      <td>23</td>\n",
       "      <td>3.80</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Name  Age  Rating\n",
       "0    Tom   25    4.23\n",
       "1  James   26    3.24\n",
       "2  Ricky   25    3.98\n",
       "3    Vin   23    2.56\n",
       "4  Steve   30    3.20\n",
       "5  Minsu   29    4.60\n",
       "6   Jack   23    3.80"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 生成样例数据\n",
    "d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack']),\n",
    "   'Age':pd.Series([25,26,25,23,30,29,23]),\n",
    "   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}\n",
    "df = pd.DataFrame(d)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Name</th>\n",
       "      <td>Tom</td>\n",
       "      <td>James</td>\n",
       "      <td>Ricky</td>\n",
       "      <td>Vin</td>\n",
       "      <td>Steve</td>\n",
       "      <td>Minsu</td>\n",
       "      <td>Jack</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Age</th>\n",
       "      <td>25</td>\n",
       "      <td>26</td>\n",
       "      <td>25</td>\n",
       "      <td>23</td>\n",
       "      <td>30</td>\n",
       "      <td>29</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rating</th>\n",
       "      <td>4.23</td>\n",
       "      <td>3.24</td>\n",
       "      <td>3.98</td>\n",
       "      <td>2.56</td>\n",
       "      <td>3.2</td>\n",
       "      <td>4.6</td>\n",
       "      <td>3.8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           0      1      2     3      4      5     6\n",
       "Name     Tom  James  Ricky   Vin  Steve  Minsu  Jack\n",
       "Age       25     26     25    23     30     29    23\n",
       "Rating  4.23   3.24   3.98  2.56    3.2    4.6   3.8"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# T 转置\n",
    "df.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[RangeIndex(start=0, stop=7, step=1),\n",
       " Index(['Name', 'Age', 'Rating'], dtype='object')]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.axes # 返回行轴标签和列轴标签列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Name       object\n",
       "Age         int64\n",
       "Rating    float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes # 返回每列的数据类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.empty # 表示对象是否为空"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.ndim # 返回对象的维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(7, 3)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape # 返回DataFrame的维度元组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "21"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.size # 返回DataFrame中的元素数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([['Tom', 25, 4.23],\n",
       "       ['James', 26, 3.24],\n",
       "       ['Ricky', 25, 3.98],\n",
       "       ['Vin', 23, 2.56],\n",
       "       ['Steve', 30, 3.2],\n",
       "       ['Minsu', 29, 4.6],\n",
       "       ['Jack', 23, 3.8]], dtype=object)"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.values # 将DataFrame中的实际数据作为NDarray返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Tom</td>\n",
       "      <td>25</td>\n",
       "      <td>4.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>James</td>\n",
       "      <td>26</td>\n",
       "      <td>3.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>25</td>\n",
       "      <td>3.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Vin</td>\n",
       "      <td>23</td>\n",
       "      <td>2.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Steve</td>\n",
       "      <td>30</td>\n",
       "      <td>3.20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Name  Age  Rating\n",
       "0    Tom   25    4.23\n",
       "1  James   26    3.24\n",
       "2  Ricky   25    3.98\n",
       "3    Vin   23    2.56\n",
       "4  Steve   30    3.20"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()  # 显示前5行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>25</td>\n",
       "      <td>3.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Vin</td>\n",
       "      <td>23</td>\n",
       "      <td>2.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Steve</td>\n",
       "      <td>30</td>\n",
       "      <td>3.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Minsu</td>\n",
       "      <td>29</td>\n",
       "      <td>4.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Jack</td>\n",
       "      <td>23</td>\n",
       "      <td>3.80</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Name  Age  Rating\n",
       "2  Ricky   25    3.98\n",
       "3    Vin   23    2.56\n",
       "4  Steve   30    3.20\n",
       "5  Minsu   29    4.60\n",
       "6   Jack   23    3.80"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail() # 显示最后5行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. pandas索引使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1 Pandas索引和选择数据"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas现在支持三种类型的多轴索引，描述如下：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1.1 .loc()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "loc 具有多种访问方式，如：\n",
    "- 单个标量标签\n",
    "- 标签列表\n",
    "- 切片对象\n",
    "- 一个布尔数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a   -2.301160\n",
       "b    0.478381\n",
       "c   -0.380384\n",
       "d   -0.010446\n",
       "e    0.681384\n",
       "f    0.434043\n",
       "g   -0.086158\n",
       "h   -1.385513\n",
       "Name: A, dtype: float64"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# loc需要两个单/列表/范围运算符，用\",\"分隔。第一个表示行，第二个表示列\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(8,4),\n",
    "                 index = ['a','b','c','d','e','f','g','h'],\n",
    "                 columns=['A','B','C','D'])\n",
    "df.loc[:,'A'] # 查询所有行的'A'列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>-2.301160</td>\n",
       "      <td>-1.884736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.478381</td>\n",
       "      <td>-1.723643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.380384</td>\n",
       "      <td>-1.811889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.010446</td>\n",
       "      <td>0.171356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.681384</td>\n",
       "      <td>-0.308361</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.434043</td>\n",
       "      <td>-0.223542</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>-0.086158</td>\n",
       "      <td>0.307840</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>-1.385513</td>\n",
       "      <td>-0.985612</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         C\n",
       "a -2.301160 -1.884736\n",
       "b  0.478381 -1.723643\n",
       "c -0.380384 -1.811889\n",
       "d -0.010446  0.171356\n",
       "e  0.681384 -0.308361\n",
       "f  0.434043 -0.223542\n",
       "g -0.086158  0.307840\n",
       "h -1.385513 -0.985612"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[:,['A','C']] # 查询多列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>-2.301160</td>\n",
       "      <td>-1.884736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.478381</td>\n",
       "      <td>-1.723643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>-1.385513</td>\n",
       "      <td>-0.985612</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         C\n",
       "a -2.301160 -1.884736\n",
       "b  0.478381 -1.723643\n",
       "h -1.385513 -0.985612"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[['a','b','h'],['A','C']] # 根据标签查询对应的行和列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>-2.301160</td>\n",
       "      <td>0.996447</td>\n",
       "      <td>-1.884736</td>\n",
       "      <td>-0.670557</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.478381</td>\n",
       "      <td>-1.251332</td>\n",
       "      <td>-1.723643</td>\n",
       "      <td>-0.333731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.380384</td>\n",
       "      <td>-0.454469</td>\n",
       "      <td>-1.811889</td>\n",
       "      <td>1.545611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.010446</td>\n",
       "      <td>0.763911</td>\n",
       "      <td>0.171356</td>\n",
       "      <td>-1.095339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.681384</td>\n",
       "      <td>1.102832</td>\n",
       "      <td>-0.308361</td>\n",
       "      <td>1.433643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.434043</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>-0.223542</td>\n",
       "      <td>0.777121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>g</th>\n",
       "      <td>-0.086158</td>\n",
       "      <td>0.069122</td>\n",
       "      <td>0.307840</td>\n",
       "      <td>1.260087</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>h</th>\n",
       "      <td>-1.385513</td>\n",
       "      <td>1.664279</td>\n",
       "      <td>-0.985612</td>\n",
       "      <td>-0.710963</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D\n",
       "a -2.301160  0.996447 -1.884736 -0.670557\n",
       "b  0.478381 -1.251332 -1.723643 -0.333731\n",
       "c -0.380384 -0.454469 -1.811889  1.545611\n",
       "d -0.010446  0.763911  0.171356 -1.095339\n",
       "e  0.681384  1.102832 -0.308361  1.433643\n",
       "f  0.434043  0.132015 -0.223542  0.777121\n",
       "g -0.086158  0.069122  0.307840  1.260087\n",
       "h -1.385513  1.664279 -0.985612 -0.710963"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['a':'h'] # 查询a行到h列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    False\n",
       "B     True\n",
       "C    False\n",
       "D    False\n",
       "Name: a, dtype: bool"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['a']>0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1.2 .iloc()\n",
    "纯整数索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各种访问方式如下：\n",
    "-    整数\n",
    "-   整数列表\n",
    "-   系列值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>-2.301160</td>\n",
       "      <td>0.996447</td>\n",
       "      <td>-1.884736</td>\n",
       "      <td>-0.670557</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.478381</td>\n",
       "      <td>-1.251332</td>\n",
       "      <td>-1.723643</td>\n",
       "      <td>-0.333731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.380384</td>\n",
       "      <td>-0.454469</td>\n",
       "      <td>-1.811889</td>\n",
       "      <td>1.545611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.010446</td>\n",
       "      <td>0.763911</td>\n",
       "      <td>0.171356</td>\n",
       "      <td>-1.095339</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D\n",
       "a -2.301160  0.996447 -1.884736 -0.670557\n",
       "b  0.478381 -1.251332 -1.723643 -0.333731\n",
       "c -0.380384 -0.454469 -1.811889  1.545611\n",
       "d -0.010446  0.763911  0.171356 -1.095339"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[:4]  # 查询前4行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-1.723643</td>\n",
       "      <td>-0.333731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-1.811889</td>\n",
       "      <td>1.545611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.171356</td>\n",
       "      <td>-1.095339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>-0.308361</td>\n",
       "      <td>1.433643</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          C         D\n",
       "b -1.723643 -0.333731\n",
       "c -1.811889  1.545611\n",
       "d  0.171356 -1.095339\n",
       "e -0.308361  1.433643"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:5,2:4]  # 查询某些行和某些列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>-1.251332</td>\n",
       "      <td>-0.333731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>0.763911</td>\n",
       "      <td>-1.095339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.777121</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          B         D\n",
       "b -1.251332 -0.333731\n",
       "d  0.763911 -1.095339\n",
       "f  0.132015  0.777121"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[[1,3,5],[1,3]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1.3 .ix()\n",
    "除了基于纯标签和整数之外，Pandas还提供了一种使用.ix()运算符进行选择和子集化对象的混合方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: DeprecationWarning: \n",
      ".ix is deprecated. Please use\n",
      ".loc for label based indexing or\n",
      ".iloc for positional indexing\n",
      "\n",
      "See the documentation here:\n",
      "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n",
      "  after removing the cwd from sys.path.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.575100</td>\n",
       "      <td>1.853529</td>\n",
       "      <td>0.508817</td>\n",
       "      <td>-1.315724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.375026</td>\n",
       "      <td>1.440633</td>\n",
       "      <td>0.966445</td>\n",
       "      <td>0.638055</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.011297</td>\n",
       "      <td>1.139015</td>\n",
       "      <td>-0.215854</td>\n",
       "      <td>1.108127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.515484</td>\n",
       "      <td>0.503384</td>\n",
       "      <td>-1.440738</td>\n",
       "      <td>1.577413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.257918</td>\n",
       "      <td>0.088944</td>\n",
       "      <td>-0.288562</td>\n",
       "      <td>0.360140</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         B         C         D\n",
       "0 -0.575100  1.853529  0.508817 -1.315724\n",
       "1 -0.375026  1.440633  0.966445  0.638055\n",
       "2  1.011297  1.139015 -0.215854  1.108127\n",
       "3  2.515484  0.503384 -1.440738  1.577413\n",
       "4  0.257918  0.088944 -0.288562  0.360140"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ix()\n",
    "df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])\n",
    "df.ix[:4] # 查询标签为0到4的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: DeprecationWarning: \n",
      ".ix is deprecated. Please use\n",
      ".loc for label based indexing or\n",
      ".iloc for positional indexing\n",
      "\n",
      "See the documentation here:\n",
      "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0   -0.575100\n",
       "1   -0.375026\n",
       "2    1.011297\n",
       "3    2.515484\n",
       "4    0.257918\n",
       "5    1.090887\n",
       "6   -2.466789\n",
       "7    1.668839\n",
       "Name: A, dtype: float64"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.ix[:,'A']  # 查找A列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0   -0.575100\n",
       "1   -0.375026\n",
       "2    1.011297\n",
       "3    2.515484\n",
       "4    0.257918\n",
       "5    1.090887\n",
       "6   -2.466789\n",
       "7    1.668839\n",
       "Name: A, dtype: float64"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 还可以通过以下方式获取某些列的值\n",
    "df['A']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.575100</td>\n",
       "      <td>0.508817</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.375026</td>\n",
       "      <td>0.966445</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.011297</td>\n",
       "      <td>-0.215854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.515484</td>\n",
       "      <td>-1.440738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.257918</td>\n",
       "      <td>-0.288562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.090887</td>\n",
       "      <td>-0.575322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-2.466789</td>\n",
       "      <td>-0.145785</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1.668839</td>\n",
       "      <td>-0.942069</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A         C\n",
       "0 -0.575100  0.508817\n",
       "1 -0.375026  0.966445\n",
       "2  1.011297 -0.215854\n",
       "3  2.515484 -1.440738\n",
       "4  0.257918 -0.288562\n",
       "5  1.090887 -0.575322\n",
       "6 -2.466789 -0.145785\n",
       "7  1.668839 -0.942069"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['A','C']] # 获取多列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0   -0.575100\n",
       "1   -0.375026\n",
       "2    1.011297\n",
       "3    2.515484\n",
       "4    0.257918\n",
       "5    1.090887\n",
       "6   -2.466789\n",
       "7    1.668839\n",
       "Name: A, dtype: float64"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 属性访问\n",
    "df.A  # 查询A列数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 Pandas重建索引\n",
    "重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以通过索引来实现多个操作:\n",
    "- 重新排序现有数据以匹配一组新的标签\n",
    "- 在没有标签数据的标签位置插入缺失值(NA)标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-01-01</td>\n",
       "      <td>High</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2019-01-03</td>\n",
       "      <td>High</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2019-01-06</td>\n",
       "      <td>Low</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           A     C   B\n",
       "0 2019-01-01  High NaN\n",
       "2 2019-01-03  High NaN\n",
       "5 2019-01-06   Low NaN"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\n",
    "   'A': pd.date_range(start='2019-01-01',periods=20,freq='D'),\n",
    "   'x': np.linspace(0,stop=20-1,num=20),\n",
    "   'y': np.random.rand(20),\n",
    "   'C': np.random.choice(['Low','Medium','High'],20).tolist(),\n",
    "   'D': np.random.normal(100, 10, size=(20)).tolist()\n",
    "})\n",
    "# 重建索引\n",
    "df_reindexed = df.reindex(index=[0,2,5],columns=['A','C','B'])  # 原本没有B列，所以B列的值都为NaN\n",
    "df_reindexed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2.1 重建索引与其他对象对齐\n",
    "有时可能希望采取一个对象和重新索引，其轴被标记为与另一个对象相同。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.116654</td>\n",
       "      <td>-0.920242</td>\n",
       "      <td>-0.094980</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.997855</td>\n",
       "      <td>0.085608</td>\n",
       "      <td>-1.738815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.443946</td>\n",
       "      <td>0.019549</td>\n",
       "      <td>0.251528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.212119</td>\n",
       "      <td>-1.210960</td>\n",
       "      <td>0.147220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.788829</td>\n",
       "      <td>2.812478</td>\n",
       "      <td>-0.393173</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.139606</td>\n",
       "      <td>1.718862</td>\n",
       "      <td>-0.949964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.123598</td>\n",
       "      <td>-1.121778</td>\n",
       "      <td>0.035585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.200309</td>\n",
       "      <td>0.043714</td>\n",
       "      <td>0.287871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.553097</td>\n",
       "      <td>-0.334700</td>\n",
       "      <td>-0.648229</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-1.081606</td>\n",
       "      <td>-0.174223</td>\n",
       "      <td>0.057483</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.116654 -0.920242 -0.094980\n",
       "1  0.997855  0.085608 -1.738815\n",
       "2  1.443946  0.019549  0.251528\n",
       "3 -1.212119 -1.210960  0.147220\n",
       "4  0.788829  2.812478 -0.393173\n",
       "5  1.139606  1.718862 -0.949964\n",
       "6  1.123598 -1.121778  0.035585\n",
       "7 -0.200309  0.043714  0.287871\n",
       "8 -0.553097 -0.334700 -0.648229\n",
       "9 -1.081606 -0.174223  0.057483"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建样例数据\n",
    "df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])\n",
    "df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])\n",
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.362711</td>\n",
       "      <td>2.126439</td>\n",
       "      <td>-0.294538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.062274</td>\n",
       "      <td>1.118789</td>\n",
       "      <td>-0.180609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.446018</td>\n",
       "      <td>-0.036722</td>\n",
       "      <td>-1.754342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.496308</td>\n",
       "      <td>0.287495</td>\n",
       "      <td>-0.544084</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.394956</td>\n",
       "      <td>2.235108</td>\n",
       "      <td>-0.087951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.242660</td>\n",
       "      <td>0.346076</td>\n",
       "      <td>0.685478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.094422</td>\n",
       "      <td>0.742144</td>\n",
       "      <td>0.743658</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  1.362711  2.126439 -0.294538\n",
       "1  1.062274  1.118789 -0.180609\n",
       "2 -0.446018 -0.036722 -1.754342\n",
       "3  0.496308  0.287495 -0.544084\n",
       "4  0.394956  2.235108 -0.087951\n",
       "5  1.242660  0.346076  0.685478\n",
       "6  0.094422  0.742144  0.743658"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.116654</td>\n",
       "      <td>-0.920242</td>\n",
       "      <td>-0.094980</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.997855</td>\n",
       "      <td>0.085608</td>\n",
       "      <td>-1.738815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.443946</td>\n",
       "      <td>0.019549</td>\n",
       "      <td>0.251528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.212119</td>\n",
       "      <td>-1.210960</td>\n",
       "      <td>0.147220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.788829</td>\n",
       "      <td>2.812478</td>\n",
       "      <td>-0.393173</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.139606</td>\n",
       "      <td>1.718862</td>\n",
       "      <td>-0.949964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.123598</td>\n",
       "      <td>-1.121778</td>\n",
       "      <td>0.035585</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.116654 -0.920242 -0.094980\n",
       "1  0.997855  0.085608 -1.738815\n",
       "2  1.443946  0.019549  0.251528\n",
       "3 -1.212119 -1.210960  0.147220\n",
       "4  0.788829  2.812478 -0.393173\n",
       "5  1.139606  1.718862 -0.949964\n",
       "6  1.123598 -1.121778  0.035585"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# reindex_like()\n",
    "# 让一个对象和另一个对象有相同的index 和 colums\n",
    "df1 = df1.reindex_like(df2) # 将df1的index和columns都转换成跟df2的index、columns一样\n",
    "df1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2.2 填充时重新加注"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "reindex_like()采用可选参数方法，它是一个填充方法，其值如下:\n",
    "- pad/ffill: 向前填充值\n",
    "- bfill/backfill: 向后填充值\n",
    "- nearest: 从最近的索引值填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.176328</td>\n",
       "      <td>0.841434</td>\n",
       "      <td>-0.714321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.176328  0.841434 -0.714321\n",
       "1 -0.779040  2.391771 -1.126933\n",
       "2       NaN       NaN       NaN\n",
       "3       NaN       NaN       NaN\n",
       "4       NaN       NaN       NaN\n",
       "5       NaN       NaN       NaN"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建样例数据\n",
    "df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])\n",
    "df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])\n",
    "df2.reindex_like(df1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.176328</td>\n",
       "      <td>0.841434</td>\n",
       "      <td>-0.714321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.176328  0.841434 -0.714321\n",
       "1 -0.779040  2.391771 -1.126933\n",
       "2 -0.779040  2.391771 -1.126933\n",
       "3 -0.779040  2.391771 -1.126933\n",
       "4 -0.779040  2.391771 -1.126933\n",
       "5 -0.779040  2.391771 -1.126933"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.reindex_like(df1,method='ffill')  # 向前填充，用前面的值来填充NaN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2.3 重新索引时的填充限制\n",
    "限制参数在重建索引时提供对填充的额外控制。限制指定连续匹配的最大计数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.176328</td>\n",
       "      <td>0.841434</td>\n",
       "      <td>-0.714321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.779040</td>\n",
       "      <td>2.391771</td>\n",
       "      <td>-1.126933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.176328  0.841434 -0.714321\n",
       "1 -0.779040  2.391771 -1.126933\n",
       "2 -0.779040  2.391771 -1.126933\n",
       "3       NaN       NaN       NaN\n",
       "4       NaN       NaN       NaN\n",
       "5       NaN       NaN       NaN"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用limit参数进行填充限制\n",
    "df2.reindex_like(df1,method='ffill',limit=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2.4 重命名\n",
    "rename()允许基于一些映射（字典或者系列）或任意函数来重新标记一个轴"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>c1</th>\n",
       "      <th>c2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>apple</th>\n",
       "      <td>1.393154</td>\n",
       "      <td>0.510697</td>\n",
       "      <td>-1.160332</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>banana</th>\n",
       "      <td>-0.952572</td>\n",
       "      <td>-0.257124</td>\n",
       "      <td>2.261260</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>durian</th>\n",
       "      <td>-0.196542</td>\n",
       "      <td>-0.817034</td>\n",
       "      <td>1.297915</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.110799</td>\n",
       "      <td>2.349779</td>\n",
       "      <td>-0.869405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.632141</td>\n",
       "      <td>-1.251734</td>\n",
       "      <td>1.320231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.576398</td>\n",
       "      <td>-1.051619</td>\n",
       "      <td>-0.053604</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              c1        c2      col3\n",
       "apple   1.393154  0.510697 -1.160332\n",
       "banana -0.952572 -0.257124  2.261260\n",
       "durian -0.196542 -0.817034  1.297915\n",
       "3      -0.110799  2.349779 -0.869405\n",
       "4      -0.632141 -1.251734  1.320231\n",
       "5      -0.576398 -1.051619 -0.053604"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用rename修改列名\n",
    "df1.rename(columns={'col1':'c1','col2':'c2'},    # 将col1更改为c1,col2更改为c2\n",
    "           index = {0:'apple',1:'banana',2:'durian'},\n",
    "           inplace=True) # inplace默认为False\n",
    "df1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. pandas统计基本功能"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 Pandas描述性统计"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas中描述性统计信息的函数如下：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Tom</td>\n",
       "      <td>25</td>\n",
       "      <td>4.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>James</td>\n",
       "      <td>26</td>\n",
       "      <td>3.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Ricky</td>\n",
       "      <td>25</td>\n",
       "      <td>3.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Vin</td>\n",
       "      <td>23</td>\n",
       "      <td>2.56</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Steve</td>\n",
       "      <td>30</td>\n",
       "      <td>3.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Minsu</td>\n",
       "      <td>29</td>\n",
       "      <td>4.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Jack</td>\n",
       "      <td>23</td>\n",
       "      <td>3.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Lee</td>\n",
       "      <td>34</td>\n",
       "      <td>3.78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>David</td>\n",
       "      <td>40</td>\n",
       "      <td>2.98</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Gasper</td>\n",
       "      <td>30</td>\n",
       "      <td>4.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Betina</td>\n",
       "      <td>51</td>\n",
       "      <td>4.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Andres</td>\n",
       "      <td>46</td>\n",
       "      <td>3.65</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Name  Age  Rating\n",
       "0      Tom   25    4.23\n",
       "1    James   26    3.24\n",
       "2    Ricky   25    3.98\n",
       "3      Vin   23    2.56\n",
       "4    Steve   30    3.20\n",
       "5    Minsu   29    4.60\n",
       "6     Jack   23    3.80\n",
       "7      Lee   34    3.78\n",
       "8    David   40    2.98\n",
       "9   Gasper   30    4.80\n",
       "10  Betina   51    4.10\n",
       "11  Andres   46    3.65"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 生成样例数据\n",
    "d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack',\n",
    "   'Lee','David','Gasper','Betina','Andres']),\n",
    "   'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),\n",
    "   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}\n",
    "df = pd.DataFrame(d)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Name      TomJamesRickyVinSteveMinsuJackLeeDavidGasperBe...\n",
       "Age                                                     382\n",
       "Rating                                                44.92\n",
       "dtype: object"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sum()方法\n",
    "# 返回所请求轴的值得总和。默认情况下，对每一列进行求和\n",
    "df.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     29.23\n",
       "1     29.24\n",
       "2     28.98\n",
       "3     25.56\n",
       "4     33.20\n",
       "5     33.60\n",
       "6     26.80\n",
       "7     37.78\n",
       "8     42.98\n",
       "9     34.80\n",
       "10    55.10\n",
       "11    49.65\n",
       "dtype: float64"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sum(axis=1) # 对每一行进行求和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Age       31.833333\n",
       "Rating     3.743333\n",
       "dtype: float64"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# mean()\n",
    "# 返回平均值\n",
    "df.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Age       9.232682\n",
       "Rating    0.661628\n",
       "dtype: float64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# std()\n",
    "# 返回数字列的标准偏差\n",
    "df.std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12.000000</td>\n",
       "      <td>12.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>31.833333</td>\n",
       "      <td>3.743333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>9.232682</td>\n",
       "      <td>0.661628</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>23.000000</td>\n",
       "      <td>2.560000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>25.000000</td>\n",
       "      <td>3.230000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>29.500000</td>\n",
       "      <td>3.790000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>35.500000</td>\n",
       "      <td>4.132500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>51.000000</td>\n",
       "      <td>4.800000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Age     Rating\n",
       "count  12.000000  12.000000\n",
       "mean   31.833333   3.743333\n",
       "std     9.232682   0.661628\n",
       "min    23.000000   2.560000\n",
       "25%    25.000000   3.230000\n",
       "50%    29.500000   3.790000\n",
       "75%    35.500000   4.132500\n",
       "max    51.000000   4.800000"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 汇总数据\n",
    "# describe()函数是用来计算有关DataFrame列的统计信息的摘要。\n",
    "df.describe() # 默认情况下只统计“数字值”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Age</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>12</td>\n",
       "      <td>12.000000</td>\n",
       "      <td>12.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unique</th>\n",
       "      <td>12</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>top</th>\n",
       "      <td>Gasper</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>freq</th>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>NaN</td>\n",
       "      <td>31.833333</td>\n",
       "      <td>3.743333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>NaN</td>\n",
       "      <td>9.232682</td>\n",
       "      <td>0.661628</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>NaN</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>2.560000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>NaN</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>3.230000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>NaN</td>\n",
       "      <td>29.500000</td>\n",
       "      <td>3.790000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>NaN</td>\n",
       "      <td>35.500000</td>\n",
       "      <td>4.132500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>NaN</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>4.800000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Name        Age     Rating\n",
       "count       12  12.000000  12.000000\n",
       "unique      12        NaN        NaN\n",
       "top     Gasper        NaN        NaN\n",
       "freq         1        NaN        NaN\n",
       "mean       NaN  31.833333   3.743333\n",
       "std        NaN   9.232682   0.661628\n",
       "min        NaN  23.000000   2.560000\n",
       "25%        NaN  25.000000   3.230000\n",
       "50%        NaN  29.500000   3.790000\n",
       "75%        NaN  35.500000   4.132500\n",
       "max        NaN  51.000000   4.800000"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe(include='all') # 将所有列汇总在一起"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Pandas函数应用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.1 Pandas统计函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.1.1 pct_change()函数\n",
    "系列，DatFrames和Panel都有pct_change()函数。此函数将每个元素与其前一个元素进行比较，并计算变化百分比。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0         NaN\n",
       "1    1.000000\n",
       "2    0.500000\n",
       "3    0.333333\n",
       "4    0.250000\n",
       "5   -0.200000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = pd.Series([1,2,3,4,5,4])\n",
    "s.pct_change() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.1.2 协方差\n",
    "协方差适用于系列数据。Series对象有一个方法cov用来计算序列对象之间的协方差。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.36071798212082085"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算过程中NA将被自动排除\n",
    "s1 = pd.Series(np.random.randn(10))\n",
    "s2 = pd.Series(np.random.randn(10))\n",
    "s1.cov(s2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "      <th>c</th>\n",
       "      <th>d</th>\n",
       "      <th>e</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.252565</td>\n",
       "      <td>0.035958</td>\n",
       "      <td>-0.158454</td>\n",
       "      <td>-0.220398</td>\n",
       "      <td>0.054208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.035958</td>\n",
       "      <td>0.215841</td>\n",
       "      <td>-0.197608</td>\n",
       "      <td>-0.153136</td>\n",
       "      <td>-0.055824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.158454</td>\n",
       "      <td>-0.197608</td>\n",
       "      <td>1.023348</td>\n",
       "      <td>-0.152120</td>\n",
       "      <td>0.151749</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.220398</td>\n",
       "      <td>-0.153136</td>\n",
       "      <td>-0.152120</td>\n",
       "      <td>0.899057</td>\n",
       "      <td>-0.284535</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.054208</td>\n",
       "      <td>-0.055824</td>\n",
       "      <td>0.151749</td>\n",
       "      <td>-0.284535</td>\n",
       "      <td>0.748557</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          a         b         c         d         e\n",
       "a  1.252565  0.035958 -0.158454 -0.220398  0.054208\n",
       "b  0.035958  0.215841 -0.197608 -0.153136 -0.055824\n",
       "c -0.158454 -0.197608  1.023348 -0.152120  0.151749\n",
       "d -0.220398 -0.153136 -0.152120  0.899057 -0.284535\n",
       "e  0.054208 -0.055824  0.151749 -0.284535  0.748557"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当应用于DataFrame时，协方差方法计算所有列之间的协方差值\n",
    "frame = pd.DataFrame(np.random.randn(10,5),columns=['a','b','c','d','e'])\n",
    "frame.cov()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.1.3 相关性\n",
    "相关性显示了任何两个数值(Series)之间的线性关系。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "      <th>c</th>\n",
       "      <th>d</th>\n",
       "      <th>e</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.069156</td>\n",
       "      <td>-0.139956</td>\n",
       "      <td>-0.207689</td>\n",
       "      <td>0.055982</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>0.069156</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.420461</td>\n",
       "      <td>-0.347630</td>\n",
       "      <td>-0.138880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>-0.139956</td>\n",
       "      <td>-0.420461</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.158591</td>\n",
       "      <td>0.173381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>-0.207689</td>\n",
       "      <td>-0.347630</td>\n",
       "      <td>-0.158591</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>-0.346841</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>0.055982</td>\n",
       "      <td>-0.138880</td>\n",
       "      <td>0.173381</td>\n",
       "      <td>-0.346841</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          a         b         c         d         e\n",
       "a  1.000000  0.069156 -0.139956 -0.207689  0.055982\n",
       "b  0.069156  1.000000 -0.420461 -0.347630 -0.138880\n",
       "c -0.139956 -0.420461  1.000000 -0.158591  0.173381\n",
       "d -0.207689 -0.347630 -0.158591  1.000000 -0.346841\n",
       "e  0.055982 -0.138880  0.173381 -0.346841  1.000000"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有多种方法来计算 pearson(默认),spearman 和 kendall之间的相关性。\n",
    "\n",
    "frame.corr() # 如果DataFrame中存在任何非数字列，则会自动排除"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.1.4 数据排名\n",
    "数据排名为元素数组中的每个元素生成排名。在关系的情况下，分配平均等级。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rank可选地使用一个默认为true的升序参数; 当错误时，数据被反向排序，也就是较大的值被分配较小的排序。Rank支持不同的方法：\n",
    "- average: 并列组平均排序等级\n",
    "- min: 组中最低的排序等级\n",
    "- max: 组中最高的排序等级\n",
    "- first: 按照它们出现在数组中的顺序分配队列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    5.0\n",
       "b    3.5\n",
       "c    2.0\n",
       "d    3.5\n",
       "e    1.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = pd.Series(np.random.np.random.randn(5),index=list('abcde'))\n",
    "s['d'] = s['b'] # 构造一个相同的情况\n",
    "s.rank()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    5.0\n",
       "b    3.0\n",
       "c    2.0\n",
       "d    3.0\n",
       "e    1.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.rank(method='min') # 使用min方法后，比如有两个排名并列第三，则两个的排名都为3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    5.0\n",
       "b    4.0\n",
       "c    2.0\n",
       "d    4.0\n",
       "e    1.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.rank(method='max') # 使用max方法后，比如有两个排名并列第三，则两个数的排名都为4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    5.0\n",
       "b    3.0\n",
       "c    2.0\n",
       "d    4.0\n",
       "e    1.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.rank(method='first') # 数值大小相同情况下，根据在数组中的位置来定排名前后"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.2 Pandas窗口函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了处理数字数据，Pandas提供了几个变体，如滚动，展开和指数移动窗口统计的权重。其中包括总和，均值，中位数，方差，协方差，相关性等。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.2.1 .rolling()函数\n",
    "这个函数可以应用于一系列数据。指定window=n参数并在其上应用适当的统计函数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)\n",
    "- window：表示时间窗的大小，注意有两种形式（int or offset）。如果使用int，则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型，表示时间窗的大小。\n",
    "- min_periods：最少需要有值的观测点的数量，对于int类型，默认与window相等。对于offset类型，默认为1。\n",
    "- center：是否使用window的中间值作为label，默认为false。只能在window是int时使用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-01</th>\n",
       "      <td>-1.327987</td>\n",
       "      <td>0.663651</td>\n",
       "      <td>1.631045</td>\n",
       "      <td>-0.042281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-02</th>\n",
       "      <td>-0.005253</td>\n",
       "      <td>0.420348</td>\n",
       "      <td>0.442055</td>\n",
       "      <td>-0.218387</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-03</th>\n",
       "      <td>0.356261</td>\n",
       "      <td>0.755611</td>\n",
       "      <td>-0.105040</td>\n",
       "      <td>-1.126363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-04</th>\n",
       "      <td>0.853231</td>\n",
       "      <td>-0.272414</td>\n",
       "      <td>1.696901</td>\n",
       "      <td>-0.336484</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-05</th>\n",
       "      <td>-0.432228</td>\n",
       "      <td>-2.321604</td>\n",
       "      <td>-0.300705</td>\n",
       "      <td>0.965461</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-06</th>\n",
       "      <td>0.032065</td>\n",
       "      <td>0.464344</td>\n",
       "      <td>1.346653</td>\n",
       "      <td>-0.127116</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-07</th>\n",
       "      <td>-0.988206</td>\n",
       "      <td>-1.518681</td>\n",
       "      <td>0.443509</td>\n",
       "      <td>1.601487</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-08</th>\n",
       "      <td>-0.396659</td>\n",
       "      <td>2.169251</td>\n",
       "      <td>-0.342024</td>\n",
       "      <td>-1.092281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-09</th>\n",
       "      <td>0.380469</td>\n",
       "      <td>-1.009371</td>\n",
       "      <td>0.117781</td>\n",
       "      <td>-0.157493</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-10</th>\n",
       "      <td>-1.792407</td>\n",
       "      <td>-1.456297</td>\n",
       "      <td>-1.377632</td>\n",
       "      <td>1.093072</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2019-01-01 -1.327987  0.663651  1.631045 -0.042281\n",
       "2019-01-02 -0.005253  0.420348  0.442055 -0.218387\n",
       "2019-01-03  0.356261  0.755611 -0.105040 -1.126363\n",
       "2019-01-04  0.853231 -0.272414  1.696901 -0.336484\n",
       "2019-01-05 -0.432228 -2.321604 -0.300705  0.965461\n",
       "2019-01-06  0.032065  0.464344  1.346653 -0.127116\n",
       "2019-01-07 -0.988206 -1.518681  0.443509  1.601487\n",
       "2019-01-08 -0.396659  2.169251 -0.342024 -1.092281\n",
       "2019-01-09  0.380469 -1.009371  0.117781 -0.157493\n",
       "2019-01-10 -1.792407 -1.456297 -1.377632  1.093072"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建样例数据\n",
    "df = pd.DataFrame(np.random.randn(10,4),\n",
    "                 index = pd.date_range('1/1/2019',periods=10),\n",
    "                 columns = ['A','B','C','D'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-01</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-02</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-03</th>\n",
       "      <td>-0.325660</td>\n",
       "      <td>0.613203</td>\n",
       "      <td>0.656020</td>\n",
       "      <td>-0.462344</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-04</th>\n",
       "      <td>0.401413</td>\n",
       "      <td>0.301181</td>\n",
       "      <td>0.677972</td>\n",
       "      <td>-0.560411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-05</th>\n",
       "      <td>0.259088</td>\n",
       "      <td>-0.612802</td>\n",
       "      <td>0.430385</td>\n",
       "      <td>-0.165796</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-06</th>\n",
       "      <td>0.151023</td>\n",
       "      <td>-0.709891</td>\n",
       "      <td>0.914283</td>\n",
       "      <td>0.167287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-07</th>\n",
       "      <td>-0.462790</td>\n",
       "      <td>-1.125313</td>\n",
       "      <td>0.496486</td>\n",
       "      <td>0.813277</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-08</th>\n",
       "      <td>-0.450933</td>\n",
       "      <td>0.371638</td>\n",
       "      <td>0.482713</td>\n",
       "      <td>0.127363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-09</th>\n",
       "      <td>-0.334799</td>\n",
       "      <td>-0.119600</td>\n",
       "      <td>0.073089</td>\n",
       "      <td>0.117237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-10</th>\n",
       "      <td>-0.602865</td>\n",
       "      <td>-0.098806</td>\n",
       "      <td>-0.533958</td>\n",
       "      <td>-0.052234</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2019-01-01       NaN       NaN       NaN       NaN\n",
       "2019-01-02       NaN       NaN       NaN       NaN\n",
       "2019-01-03 -0.325660  0.613203  0.656020 -0.462344\n",
       "2019-01-04  0.401413  0.301181  0.677972 -0.560411\n",
       "2019-01-05  0.259088 -0.612802  0.430385 -0.165796\n",
       "2019-01-06  0.151023 -0.709891  0.914283  0.167287\n",
       "2019-01-07 -0.462790 -1.125313  0.496486  0.813277\n",
       "2019-01-08 -0.450933  0.371638  0.482713  0.127363\n",
       "2019-01-09 -0.334799 -0.119600  0.073089  0.117237\n",
       "2019-01-10 -0.602865 -0.098806 -0.533958 -0.052234"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用途：滚动窗口计算 按指定周期计算\n",
    "df.rolling(window=3).mean()\n",
    "# 由于窗口大小为3，前两个元素为空值，第三个元素的值为n，n-1,n-2元素的平均值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.2.2 .expanding()函数\n",
    "提供扩展转换"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DataFrame.expanding(min_periods=1, center=False, axis=0)，其中参数的意义和rolling一样，只是其不是固定窗口长度，其长度是不断的扩大的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-01</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-02</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-03</th>\n",
       "      <td>-0.325660</td>\n",
       "      <td>0.613203</td>\n",
       "      <td>0.656020</td>\n",
       "      <td>-0.462344</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-04</th>\n",
       "      <td>-0.030937</td>\n",
       "      <td>0.391799</td>\n",
       "      <td>0.916240</td>\n",
       "      <td>-0.430879</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-05</th>\n",
       "      <td>-0.111195</td>\n",
       "      <td>-0.150882</td>\n",
       "      <td>0.672851</td>\n",
       "      <td>-0.151611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-06</th>\n",
       "      <td>-0.087319</td>\n",
       "      <td>-0.048344</td>\n",
       "      <td>0.785151</td>\n",
       "      <td>-0.147529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-07</th>\n",
       "      <td>-0.216017</td>\n",
       "      <td>-0.258392</td>\n",
       "      <td>0.736345</td>\n",
       "      <td>0.102331</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-08</th>\n",
       "      <td>-0.238597</td>\n",
       "      <td>0.045063</td>\n",
       "      <td>0.601549</td>\n",
       "      <td>-0.046996</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-09</th>\n",
       "      <td>-0.169812</td>\n",
       "      <td>-0.072096</td>\n",
       "      <td>0.547797</td>\n",
       "      <td>-0.059273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-10</th>\n",
       "      <td>-0.332071</td>\n",
       "      <td>-0.210516</td>\n",
       "      <td>0.355254</td>\n",
       "      <td>0.055961</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2019-01-01       NaN       NaN       NaN       NaN\n",
       "2019-01-02       NaN       NaN       NaN       NaN\n",
       "2019-01-03 -0.325660  0.613203  0.656020 -0.462344\n",
       "2019-01-04 -0.030937  0.391799  0.916240 -0.430879\n",
       "2019-01-05 -0.111195 -0.150882  0.672851 -0.151611\n",
       "2019-01-06 -0.087319 -0.048344  0.785151 -0.147529\n",
       "2019-01-07 -0.216017 -0.258392  0.736345  0.102331\n",
       "2019-01-08 -0.238597  0.045063  0.601549 -0.046996\n",
       "2019-01-09 -0.169812 -0.072096  0.547797 -0.059273\n",
       "2019-01-10 -0.332071 -0.210516  0.355254  0.055961"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用途：提供扩展转换。累计计算，如累加求和\n",
    "df.expanding(min_periods=3).mean()\n",
    "# 第n个结果值为 第1,2，..，n-1的值求和再求平均"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.3 Pandas其他函数应用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas函数应用主要有以下几方面的运用：\n",
    "- 表合理函数应用：pipe()\n",
    "- 行或列函数应用：apply()\n",
    "- 元素函数应用：applymap()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.3.1 表格函数应用\n",
    "可以通过将函数和适当数量的参数作为管道参数来执行自定义操作。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.134922</td>\n",
       "      <td>1.742178</td>\n",
       "      <td>2.275130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.076044</td>\n",
       "      <td>1.235144</td>\n",
       "      <td>0.440649</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.825690</td>\n",
       "      <td>1.395828</td>\n",
       "      <td>0.175502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.272963</td>\n",
       "      <td>0.227594</td>\n",
       "      <td>0.623802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.309135</td>\n",
       "      <td>0.535770</td>\n",
       "      <td>2.385485</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  2.134922  1.742178  2.275130\n",
       "1  2.076044  1.235144  0.440649\n",
       "2  1.825690  1.395828  0.175502\n",
       "3  1.272963  0.227594  0.623802\n",
       "4  2.309135  0.535770  2.385485"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# adder函数\n",
    "# adder函数将两个数值作为参数相加并返回总和\n",
    "def adder(ele1,ele2): \n",
    "    return ele1+ele2\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])\n",
    "df.pipe(adder,2)  # 为所有元素相加一个值2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.3.2 行或列合理函数应用\n",
    "可以使用apply()方法沿DataFrame或Panel的轴应用任意函数，它与描述性统计方法一样，采用可选的axis参数。 默认情况下，操作按列执行，将每列列为数组。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "col1    0.324740\n",
       "col2    1.023603\n",
       "col3   -0.097148\n",
       "dtype: float64"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# apply()\n",
    "# 可以使用apply()方法沿DataFrame或Panel的轴应用任意函数\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])\n",
    "df.apply(np.mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.883146\n",
       "1    0.500423\n",
       "2   -0.016306\n",
       "3   -0.588286\n",
       "4    1.306348\n",
       "dtype: float64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(np.mean,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "col1    1.750537\n",
       "col2    4.022997\n",
       "col3    2.924760\n",
       "dtype: float64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(lambda x:x.max() - x.min())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.2.3.3 元素合理函数应用\n",
    "并不是所有的函数都可以向量化(也不是返回另一个数组的NumPy数组，也不是任何值)，在DataFrame上的方法applymap()和类似于在Series上的map()接受任何Python函数，并且返回单个值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    -32.095232\n",
       "1    136.731397\n",
       "2     48.233763\n",
       "3    -38.322272\n",
       "4     47.822448\n",
       "Name: col1, dtype: float64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# map针对于Series\n",
    "df['col1'].map(lambda x:x*100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-32.095232</td>\n",
       "      <td>340.825931</td>\n",
       "      <td>-43.786954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>136.731397</td>\n",
       "      <td>-3.286422</td>\n",
       "      <td>16.681865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>48.233763</td>\n",
       "      <td>65.502181</td>\n",
       "      <td>-118.627596</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-38.322272</td>\n",
       "      <td>-61.473778</td>\n",
       "      <td>-76.689607</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>47.822448</td>\n",
       "      <td>170.233595</td>\n",
       "      <td>173.848357</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         col1        col2        col3\n",
       "0  -32.095232  340.825931  -43.786954\n",
       "1  136.731397   -3.286422   16.681865\n",
       "2   48.233763   65.502181 -118.627596\n",
       "3  -38.322272  -61.473778  -76.689607\n",
       "4   47.822448  170.233595  173.848357"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# applymap针对DataFrame\n",
    "df.applymap(lambda x:x*100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.32</td>\n",
       "      <td>3.41</td>\n",
       "      <td>-0.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.37</td>\n",
       "      <td>-0.03</td>\n",
       "      <td>0.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.48</td>\n",
       "      <td>0.66</td>\n",
       "      <td>-1.19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.38</td>\n",
       "      <td>-0.61</td>\n",
       "      <td>-0.77</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.48</td>\n",
       "      <td>1.70</td>\n",
       "      <td>1.74</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    col1   col2   col3\n",
       "0  -0.32   3.41  -0.44\n",
       "1   1.37  -0.03   0.17\n",
       "2   0.48   0.66  -1.19\n",
       "3  -0.38  -0.61  -0.77\n",
       "4   0.48   1.70   1.74"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以利用applymap对DataFrame中的每个值进行操作\n",
    "# 比如：将DataFrame中的各个浮点值保留两位小数\n",
    "f=lambda x: '%.2f'%x\n",
    "df.applymap(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 数据运算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.3.1 Series之间的运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1\n",
       "b    2\n",
       "c    3\n",
       "d    4\n",
       "dtype: int64"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "m = pd.Series([1,2,3,4],index=['a','b','c','d'])\n",
    "n = pd.Series([1,-1,3,-7,-2],index=['a','e','c','f','g'])\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1\n",
       "e   -1\n",
       "c    3\n",
       "f   -7\n",
       "g   -2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    2.0\n",
       "b    NaN\n",
       "c    6.0\n",
       "d    NaN\n",
       "e    NaN\n",
       "f    NaN\n",
       "g    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m+n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "sereis相加会自动进行数据对齐操作，在不重叠的索引处会使用NA(NaN)值进行填充，series进行算术运算的时候，不需要保证series的大小一致。其余操作类似。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    0.0\n",
       "b    NaN\n",
       "c    0.0\n",
       "d    NaN\n",
       "e    NaN\n",
       "f    NaN\n",
       "g    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m-n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    NaN\n",
       "c    9.0\n",
       "d    NaN\n",
       "e    NaN\n",
       "f    NaN\n",
       "g    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m*n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.0\n",
       "b    NaN\n",
       "c    1.0\n",
       "d    NaN\n",
       "e    NaN\n",
       "f    NaN\n",
       "g    NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m/n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.3.2 DataFrame之间的运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>four</th>\n",
       "      <th>one</th>\n",
       "      <th>three</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>8.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   four  one  three   two\n",
       "a   NaN  2.0    NaN   4.0\n",
       "b   NaN  8.0    NaN  10.0\n",
       "c   NaN  NaN    NaN   NaN\n",
       "e   NaN  NaN    NaN   NaN"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d1 = np.arange(1,10).reshape(3,3)\n",
    "data1 = pd.DataFrame(d1,index=[\"a\",\"b\",\"c\"],columns=[\"one\",\"two\",\"three\"])\n",
    "d2 = np.arange(1,10).reshape(3,3)\n",
    "data2 = pd.DataFrame(d2,index=[\"a\",\"b\",\"e\"],columns=[\"one\",\"two\",\"four\"])\n",
    "data1 + data2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "dataFrame相加时，对齐操作需要行和列的索引都重叠的时候才会相加，否则会使用NA值进行填充。其他操作类似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>four</th>\n",
       "      <th>one</th>\n",
       "      <th>three</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   four  one  three  two\n",
       "a   NaN  0.0    NaN  0.0\n",
       "b   NaN  0.0    NaN  0.0\n",
       "c   NaN  NaN    NaN  NaN\n",
       "e   NaN  NaN    NaN  NaN"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data1 - data2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>four</th>\n",
       "      <th>one</th>\n",
       "      <th>three</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>16.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   four   one  three   two\n",
       "a   NaN   1.0    NaN   4.0\n",
       "b   NaN  16.0    NaN  25.0\n",
       "c   NaN   NaN    NaN   NaN\n",
       "e   NaN   NaN    NaN   NaN"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data1 * data2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>four</th>\n",
       "      <th>one</th>\n",
       "      <th>three</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>e</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   four  one  three  two\n",
       "a   NaN  1.0    NaN  1.0\n",
       "b   NaN  1.0    NaN  1.0\n",
       "c   NaN  NaN    NaN  NaN\n",
       "e   NaN  NaN    NaN  NaN"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data1 / data2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.3.3 DataFrame与Series的混合运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:5: FutureWarning: \n",
      ".ix is deprecated. Please use\n",
      ".loc for label based indexing or\n",
      ".iloc for positional indexing\n",
      "\n",
      "See the documentation here:\n",
      "http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated\n",
      "  \"\"\"\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>3</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two  three\n",
       "a    0    2      4\n",
       "b    3    5      7\n",
       "c    6    8     10"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# DataFrame的行进行广播\n",
    "a = np.arange(9).reshape(3,3)\n",
    "d = pd.DataFrame(a,index=['a','b','c'],columns=['one','two','three'])\n",
    "# 取d的第一行为Series\n",
    "s = d.ix[0]\n",
    "\n",
    "d + s  # dataframe每一行都与第一行的数值相加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two  three\n",
       "a    0    1      2\n",
       "b    6    7      8\n",
       "c   12   13     14"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# DataFrame的列进行广播\n",
    "s = d['one']\n",
    "d.add(s,axis=0) # dataframe每一列都与第一列的数值相加"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.4 pandas分组与聚合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.1 分组"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "任何分组(groupby)操作都涉及原始对象的以下操作之一：\n",
    "- 分割对象\n",
    "- 应用一个函数\n",
    "- 结合的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Team</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Riders</td>\n",
       "      <td>1</td>\n",
       "      <td>2014</td>\n",
       "      <td>876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2015</td>\n",
       "      <td>789</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Devils</td>\n",
       "      <td>2</td>\n",
       "      <td>2014</td>\n",
       "      <td>863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Devils</td>\n",
       "      <td>3</td>\n",
       "      <td>2015</td>\n",
       "      <td>673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Kings</td>\n",
       "      <td>3</td>\n",
       "      <td>2014</td>\n",
       "      <td>741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>kings</td>\n",
       "      <td>4</td>\n",
       "      <td>2015</td>\n",
       "      <td>812</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Kings</td>\n",
       "      <td>1</td>\n",
       "      <td>2016</td>\n",
       "      <td>756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Kings</td>\n",
       "      <td>1</td>\n",
       "      <td>2017</td>\n",
       "      <td>788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2016</td>\n",
       "      <td>694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Royals</td>\n",
       "      <td>4</td>\n",
       "      <td>2014</td>\n",
       "      <td>701</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Royals</td>\n",
       "      <td>1</td>\n",
       "      <td>2015</td>\n",
       "      <td>804</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2017</td>\n",
       "      <td>690</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Team  Rank  Year  Points\n",
       "0   Riders     1  2014     876\n",
       "1   Riders     2  2015     789\n",
       "2   Devils     2  2014     863\n",
       "3   Devils     3  2015     673\n",
       "4    Kings     3  2014     741\n",
       "5    kings     4  2015     812\n",
       "6    Kings     1  2016     756\n",
       "7    Kings     1  2017     788\n",
       "8   Riders     2  2016     694\n",
       "9   Royals     4  2014     701\n",
       "10  Royals     1  2015     804\n",
       "11  Riders     2  2017     690"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建样例数据\n",
    "ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',\n",
    "         'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],\n",
    "         'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],\n",
    "         'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],\n",
    "         'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}\n",
    "df = pd.DataFrame(ipl_data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x0000016E441FCA90>"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# groupby 将数据拆分为组\n",
    "df.groupby('Team') # 按Team来分组"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.1.1 查看分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Devils': Int64Index([2, 3], dtype='int64'),\n",
       " 'Kings': Int64Index([4, 6, 7], dtype='int64'),\n",
       " 'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),\n",
       " 'Royals': Int64Index([9, 10], dtype='int64'),\n",
       " 'kings': Int64Index([5], dtype='int64')}"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('Team').groups"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{('Devils', 2014): Int64Index([2], dtype='int64'),\n",
       " ('Devils', 2015): Int64Index([3], dtype='int64'),\n",
       " ('Kings', 2014): Int64Index([4], dtype='int64'),\n",
       " ('Kings', 2016): Int64Index([6], dtype='int64'),\n",
       " ('Kings', 2017): Int64Index([7], dtype='int64'),\n",
       " ('Riders', 2014): Int64Index([0], dtype='int64'),\n",
       " ('Riders', 2015): Int64Index([1], dtype='int64'),\n",
       " ('Riders', 2016): Int64Index([8], dtype='int64'),\n",
       " ('Riders', 2017): Int64Index([11], dtype='int64'),\n",
       " ('Royals', 2014): Int64Index([9], dtype='int64'),\n",
       " ('Royals', 2015): Int64Index([10], dtype='int64'),\n",
       " ('kings', 2015): Int64Index([5], dtype='int64')}"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按多列分组\n",
    "df.groupby(['Team','Year']).groups"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.1.2 迭代遍历分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2014\n",
      "     Team  Rank  Year  Points\n",
      "0  Riders     1  2014     876\n",
      "2  Devils     2  2014     863\n",
      "4   Kings     3  2014     741\n",
      "9  Royals     4  2014     701\n",
      "2015\n",
      "      Team  Rank  Year  Points\n",
      "1   Riders     2  2015     789\n",
      "3   Devils     3  2015     673\n",
      "5    kings     4  2015     812\n",
      "10  Royals     1  2015     804\n",
      "2016\n",
      "     Team  Rank  Year  Points\n",
      "6   Kings     1  2016     756\n",
      "8  Riders     2  2016     694\n",
      "2017\n",
      "      Team  Rank  Year  Points\n",
      "7    Kings     1  2017     788\n",
      "11  Riders     2  2017     690\n"
     ]
    }
   ],
   "source": [
    "# 对于groupby对象，可以遍历类似itertools.obj的对象\n",
    "grouped = df.groupby('Year')\n",
    "for name,group in grouped:\n",
    "    print(name)\n",
    "    print(group)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Team</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Riders</td>\n",
       "      <td>1</td>\n",
       "      <td>2014</td>\n",
       "      <td>876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Devils</td>\n",
       "      <td>2</td>\n",
       "      <td>2014</td>\n",
       "      <td>863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Kings</td>\n",
       "      <td>3</td>\n",
       "      <td>2014</td>\n",
       "      <td>741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Royals</td>\n",
       "      <td>4</td>\n",
       "      <td>2014</td>\n",
       "      <td>701</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Team  Rank  Year  Points\n",
       "0  Riders     1  2014     876\n",
       "2  Devils     2  2014     863\n",
       "4   Kings     3  2014     741\n",
       "9  Royals     4  2014     701"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 选择一个分组\n",
    "# 使用get_group()方法，可以选择一个组。\n",
    "grouped = df.groupby('Year')\n",
    "grouped.get_group(2014)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Year</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014</th>\n",
       "      <td>2.5</td>\n",
       "      <td>795.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015</th>\n",
       "      <td>2.5</td>\n",
       "      <td>769.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2016</th>\n",
       "      <td>1.5</td>\n",
       "      <td>725.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017</th>\n",
       "      <td>1.5</td>\n",
       "      <td>739.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Rank  Points\n",
       "Year              \n",
       "2014   2.5  795.25\n",
       "2015   2.5  769.50\n",
       "2016   1.5  725.00\n",
       "2017   1.5  739.00"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对分组后的数据进行统计操作\n",
    "df.groupby('Year').mean() # 按Year列分组，获取其他列均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Year</th>\n",
       "      <th>Team</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"4\" valign=\"top\">2014</th>\n",
       "      <th>Devils</th>\n",
       "      <td>2</td>\n",
       "      <td>863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Kings</th>\n",
       "      <td>3</td>\n",
       "      <td>741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Riders</th>\n",
       "      <td>1</td>\n",
       "      <td>876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Royals</th>\n",
       "      <td>4</td>\n",
       "      <td>701</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"4\" valign=\"top\">2015</th>\n",
       "      <th>Devils</th>\n",
       "      <td>3</td>\n",
       "      <td>673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Riders</th>\n",
       "      <td>2</td>\n",
       "      <td>789</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Royals</th>\n",
       "      <td>1</td>\n",
       "      <td>804</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>kings</th>\n",
       "      <td>4</td>\n",
       "      <td>812</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">2016</th>\n",
       "      <th>Kings</th>\n",
       "      <td>1</td>\n",
       "      <td>756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Riders</th>\n",
       "      <td>2</td>\n",
       "      <td>694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">2017</th>\n",
       "      <th>Kings</th>\n",
       "      <td>1</td>\n",
       "      <td>788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Riders</th>\n",
       "      <td>2</td>\n",
       "      <td>690</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Rank  Points\n",
       "Year Team                \n",
       "2014 Devils     2     863\n",
       "     Kings      3     741\n",
       "     Riders     1     876\n",
       "     Royals     4     701\n",
       "2015 Devils     3     673\n",
       "     Riders     2     789\n",
       "     Royals     1     804\n",
       "     kings      4     812\n",
       "2016 Kings      1     756\n",
       "     Riders     2     694\n",
       "2017 Kings      1     788\n",
       "     Riders     2     690"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按多列分组，并获取其他列的均值\n",
    "df.groupby(['Year','Team']).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Year\n",
       "2014    795.25\n",
       "2015    769.50\n",
       "2016    725.00\n",
       "2017    739.00\n",
       "Name: Points, dtype: float64"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 也可以分组后，选择列进行运算\n",
    "g = df.groupby('Year') # 先按Year列分组\n",
    "g['Points'].mean() # 再对分组总的Points列进行求均值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.2 聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Year\n",
       "2014    795.25\n",
       "2015    769.50\n",
       "2016    725.00\n",
       "2017    739.00\n",
       "Name: Points, dtype: float64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 聚合函数为每个组返回单个聚合值。当创建了分组(group by)对象，就可以对分组数据执行多个聚合操作。\n",
    "# 比较常用的是使用agg\n",
    "grouped = df.groupby('Year')\n",
    "grouped['Points'].agg(np.mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Year</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014</th>\n",
       "      <td>3181</td>\n",
       "      <td>795.25</td>\n",
       "      <td>87.439026</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015</th>\n",
       "      <td>3078</td>\n",
       "      <td>769.50</td>\n",
       "      <td>65.035888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2016</th>\n",
       "      <td>1450</td>\n",
       "      <td>725.00</td>\n",
       "      <td>43.840620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017</th>\n",
       "      <td>1478</td>\n",
       "      <td>739.00</td>\n",
       "      <td>69.296465</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       sum    mean        std\n",
       "Year                         \n",
       "2014  3181  795.25  87.439026\n",
       "2015  3078  769.50  65.035888\n",
       "2016  1450  725.00  43.840620\n",
       "2017  1478  739.00  69.296465"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 一次应用多个聚合函数\n",
    "grouped = df.groupby('Year')\n",
    "grouped['Points'].agg([np.sum,np.mean,np.std])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.2.1 转换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-15.000000</td>\n",
       "      <td>-11.618950</td>\n",
       "      <td>12.843272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>-3.872983</td>\n",
       "      <td>3.020286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-7.071068</td>\n",
       "      <td>-7.071068</td>\n",
       "      <td>7.071068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7.071068</td>\n",
       "      <td>7.071068</td>\n",
       "      <td>-7.071068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11.547005</td>\n",
       "      <td>-10.910895</td>\n",
       "      <td>-8.608621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-5.773503</td>\n",
       "      <td>2.182179</td>\n",
       "      <td>-2.360428</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-5.773503</td>\n",
       "      <td>8.728716</td>\n",
       "      <td>10.969049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>3.872983</td>\n",
       "      <td>-7.705963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>7.071068</td>\n",
       "      <td>-7.071068</td>\n",
       "      <td>-7.071068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>-7.071068</td>\n",
       "      <td>7.071068</td>\n",
       "      <td>7.071068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>11.618950</td>\n",
       "      <td>-8.157595</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Rank       Year     Points\n",
       "0  -15.000000 -11.618950  12.843272\n",
       "1    5.000000  -3.872983   3.020286\n",
       "2   -7.071068  -7.071068   7.071068\n",
       "3    7.071068   7.071068  -7.071068\n",
       "4   11.547005 -10.910895  -8.608621\n",
       "5         NaN        NaN        NaN\n",
       "6   -5.773503   2.182179  -2.360428\n",
       "7   -5.773503   8.728716  10.969049\n",
       "8    5.000000   3.872983  -7.705963\n",
       "9    7.071068  -7.071068  -7.071068\n",
       "10  -7.071068   7.071068   7.071068\n",
       "11   5.000000  11.618950  -8.157595"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# transform能返回完整数据的某一变换。输出的形状和输入一致。\n",
    "g = df.groupby('Team')\n",
    "score = lambda x: (x - x.mean()) / x.std()*10\n",
    "g.transform(score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.2.2 agg 与 transform 比较"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Team</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Devils</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Kings</th>\n",
       "      <td>1.666667</td>\n",
       "      <td>2015.666667</td>\n",
       "      <td>761.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Riders</th>\n",
       "      <td>1.750000</td>\n",
       "      <td>2015.500000</td>\n",
       "      <td>762.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Royals</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>752.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>kings</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>2015.000000</td>\n",
       "      <td>812.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Rank         Year      Points\n",
       "Team                                     \n",
       "Devils  2.500000  2014.500000  768.000000\n",
       "Kings   1.666667  2015.666667  761.666667\n",
       "Riders  1.750000  2015.500000  762.250000\n",
       "Royals  2.500000  2014.500000  752.500000\n",
       "kings   4.000000  2015.000000  812.000000"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# agg会返回数据的缩减版本，而transform能返回完整数据\n",
    "# 下面以举例的形式说明\n",
    "g.agg(np.mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Devils      Team  Rank  Year  Points\n",
      "2  Devils     2  2014     863\n",
      "3  Devils     3  2015     673\n",
      "Kings     Team  Rank  Year  Points\n",
      "4  Kings     3  2014     741\n",
      "6  Kings     1  2016     756\n",
      "7  Kings     1  2017     788\n",
      "Riders       Team  Rank  Year  Points\n",
      "0   Riders     1  2014     876\n",
      "1   Riders     2  2015     789\n",
      "8   Riders     2  2016     694\n",
      "11  Riders     2  2017     690\n",
      "Royals       Team  Rank  Year  Points\n",
      "9   Royals     4  2014     701\n",
      "10  Royals     1  2015     804\n",
      "kings     Team  Rank  Year  Points\n",
      "5  kings     4  2015     812\n"
     ]
    }
   ],
   "source": [
    "# 查看一下分组的结果\n",
    "for k,v in g:\n",
    "    print(k,v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.750000</td>\n",
       "      <td>2015.500000</td>\n",
       "      <td>762.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.750000</td>\n",
       "      <td>2015.500000</td>\n",
       "      <td>762.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.666667</td>\n",
       "      <td>2015.666667</td>\n",
       "      <td>761.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>2015.000000</td>\n",
       "      <td>812.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.666667</td>\n",
       "      <td>2015.666667</td>\n",
       "      <td>761.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1.666667</td>\n",
       "      <td>2015.666667</td>\n",
       "      <td>761.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.750000</td>\n",
       "      <td>2015.500000</td>\n",
       "      <td>762.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>752.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>2014.500000</td>\n",
       "      <td>752.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>1.750000</td>\n",
       "      <td>2015.500000</td>\n",
       "      <td>762.250000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Rank         Year      Points\n",
       "0   1.750000  2015.500000  762.250000\n",
       "1   1.750000  2015.500000  762.250000\n",
       "2   2.500000  2014.500000  768.000000\n",
       "3   2.500000  2014.500000  768.000000\n",
       "4   1.666667  2015.666667  761.666667\n",
       "5   4.000000  2015.000000  812.000000\n",
       "6   1.666667  2015.666667  761.666667\n",
       "7   1.666667  2015.666667  761.666667\n",
       "8   1.750000  2015.500000  762.250000\n",
       "9   2.500000  2014.500000  752.500000\n",
       "10  2.500000  2014.500000  752.500000\n",
       "11  1.750000  2015.500000  762.250000"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.transform(np.mean)\n",
    "# 结果解释，第0、1、8、11行的数据是一样的，这是因为在Riders这个Team中，总共有四行数据，且每一行都用该组的均值表示"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.4.2.3 过滤"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Team</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Riders</td>\n",
       "      <td>1</td>\n",
       "      <td>2014</td>\n",
       "      <td>876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2015</td>\n",
       "      <td>789</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2016</td>\n",
       "      <td>694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2017</td>\n",
       "      <td>690</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Team  Rank  Year  Points\n",
       "0   Riders     1  2014     876\n",
       "1   Riders     2  2015     789\n",
       "8   Riders     2  2016     694\n",
       "11  Riders     2  2017     690"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# filter()函数用于过滤数据\n",
    "# 根据定义的标准过滤数据,并返回数据的子集\n",
    "\n",
    "f = df.groupby('Team').filter(lambda x: len(x)>3) #筛选出记录数大于3的组\n",
    "f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Team</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Year</th>\n",
       "      <th>Points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Riders</td>\n",
       "      <td>1</td>\n",
       "      <td>2014</td>\n",
       "      <td>876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2015</td>\n",
       "      <td>789</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Devils</td>\n",
       "      <td>2</td>\n",
       "      <td>2014</td>\n",
       "      <td>863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Devils</td>\n",
       "      <td>3</td>\n",
       "      <td>2015</td>\n",
       "      <td>673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Kings</td>\n",
       "      <td>3</td>\n",
       "      <td>2014</td>\n",
       "      <td>741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Kings</td>\n",
       "      <td>1</td>\n",
       "      <td>2016</td>\n",
       "      <td>756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Kings</td>\n",
       "      <td>1</td>\n",
       "      <td>2017</td>\n",
       "      <td>788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2016</td>\n",
       "      <td>694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Riders</td>\n",
       "      <td>2</td>\n",
       "      <td>2017</td>\n",
       "      <td>690</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Team  Rank  Year  Points\n",
       "0   Riders     1  2014     876\n",
       "1   Riders     2  2015     789\n",
       "2   Devils     2  2014     863\n",
       "3   Devils     3  2015     673\n",
       "4    Kings     3  2014     741\n",
       "6    Kings     1  2016     756\n",
       "7    Kings     1  2017     788\n",
       "8   Riders     2  2016     694\n",
       "11  Riders     2  2017     690"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('Team').filter(lambda x: np.max(x['Rank'])<=3)  # 筛选出组中最大排名不超过3的组"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.5 pandas排序"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas有两种排序方式，分别是：\n",
    "- 按标签\n",
    "- 按实际值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col2</th>\n",
       "      <th>col1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.679809</td>\n",
       "      <td>-0.327875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.580933</td>\n",
       "      <td>-0.024787</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.600616</td>\n",
       "      <td>-0.057837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.047888</td>\n",
       "      <td>-0.268427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.137648</td>\n",
       "      <td>-0.615558</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.742281</td>\n",
       "      <td>0.966626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.696446</td>\n",
       "      <td>0.869444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.285668</td>\n",
       "      <td>0.652800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.460373</td>\n",
       "      <td>1.873532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.177655</td>\n",
       "      <td>1.459921</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col2      col1\n",
       "1  0.679809 -0.327875\n",
       "4  1.580933 -0.024787\n",
       "6  0.600616 -0.057837\n",
       "2 -0.047888 -0.268427\n",
       "3 -0.137648 -0.615558\n",
       "5 -0.742281  0.966626\n",
       "9 -0.696446  0.869444\n",
       "8  0.285668  0.652800\n",
       "0 -0.460373  1.873532\n",
       "7  0.177655  1.459921"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 生成样例数据\n",
    "unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1'])\n",
    "unsorted_df  # 该df中，标签和值未排序"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.5.1 按标签排序\n",
    "使用sort_index()方法，通过传递axis参数和排序顺序，可以对DataFrame进行排序。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col2</th>\n",
       "      <th>col1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.460373</td>\n",
       "      <td>1.873532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.679809</td>\n",
       "      <td>-0.327875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.047888</td>\n",
       "      <td>-0.268427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.137648</td>\n",
       "      <td>-0.615558</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.580933</td>\n",
       "      <td>-0.024787</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.742281</td>\n",
       "      <td>0.966626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.600616</td>\n",
       "      <td>-0.057837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.177655</td>\n",
       "      <td>1.459921</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.285668</td>\n",
       "      <td>0.652800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.696446</td>\n",
       "      <td>0.869444</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col2      col1\n",
       "0 -0.460373  1.873532\n",
       "1  0.679809 -0.327875\n",
       "2 -0.047888 -0.268427\n",
       "3 -0.137648 -0.615558\n",
       "4  1.580933 -0.024787\n",
       "5 -0.742281  0.966626\n",
       "6  0.600616 -0.057837\n",
       "7  0.177655  1.459921\n",
       "8  0.285668  0.652800\n",
       "9 -0.696446  0.869444"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 默认情况下，按照升序对行标签进行排序\n",
    "\n",
    "sorted_df = unsorted_df.sort_index()\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col2</th>\n",
       "      <th>col1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.696446</td>\n",
       "      <td>0.869444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.285668</td>\n",
       "      <td>0.652800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.177655</td>\n",
       "      <td>1.459921</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.600616</td>\n",
       "      <td>-0.057837</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.742281</td>\n",
       "      <td>0.966626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.580933</td>\n",
       "      <td>-0.024787</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.137648</td>\n",
       "      <td>-0.615558</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.047888</td>\n",
       "      <td>-0.268427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.679809</td>\n",
       "      <td>-0.327875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.460373</td>\n",
       "      <td>1.873532</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col2      col1\n",
       "9 -0.696446  0.869444\n",
       "8  0.285668  0.652800\n",
       "7  0.177655  1.459921\n",
       "6  0.600616 -0.057837\n",
       "5 -0.742281  0.966626\n",
       "4  1.580933 -0.024787\n",
       "3 -0.137648 -0.615558\n",
       "2 -0.047888 -0.268427\n",
       "1  0.679809 -0.327875\n",
       "0 -0.460373  1.873532"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过将布尔值传递给升序参数，可以控制排序顺序（ascending参数）\n",
    "sorted_df = unsorted_df.sort_index(ascending=False) #降序\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.5.2 按列排序\n",
    "通过传递axis参数值为0或1，可以对列标签进行排序。默认情况下，axis = 0，逐行排列。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.327875</td>\n",
       "      <td>0.679809</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.024787</td>\n",
       "      <td>1.580933</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.057837</td>\n",
       "      <td>0.600616</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.268427</td>\n",
       "      <td>-0.047888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.615558</td>\n",
       "      <td>-0.137648</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.966626</td>\n",
       "      <td>-0.742281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.869444</td>\n",
       "      <td>-0.696446</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.652800</td>\n",
       "      <td>0.285668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.873532</td>\n",
       "      <td>-0.460373</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1.459921</td>\n",
       "      <td>0.177655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2\n",
       "1 -0.327875  0.679809\n",
       "4 -0.024787  1.580933\n",
       "6 -0.057837  0.600616\n",
       "2 -0.268427 -0.047888\n",
       "3 -0.615558 -0.137648\n",
       "5  0.966626 -0.742281\n",
       "9  0.869444 -0.696446\n",
       "8  0.652800  0.285668\n",
       "0  1.873532 -0.460373\n",
       "7  1.459921  0.177655"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted_df = unsorted_df.sort_index(axis = 1)\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.5.3 按值排序\n",
    "像索引排序一样，sort_values()是按值排序的方法。它接受一个by参数，它将使用要与其排序值的DataFrame的列名称。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "1     1     3\n",
       "2     1     2\n",
       "3     1     4\n",
       "0     2     1"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sort_values()\n",
    "unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})\n",
    "sorted_df = unsorted_df.sort_values(by='col1') # 根据列col1的值来排序\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "2     1     2\n",
       "1     1     3\n",
       "3     1     4\n",
       "0     2     1"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以根据多列的值大小来排序\n",
    "# 比如下列，先按col1列的值排序，当col1列的值相同时，再考虑col2列的值大小\n",
    "sorted_df = unsorted_df.sort_values(by=['col1','col2'])\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.5.4 排序算法\n",
    "sort_values()提供了从mergeesort，heapsort和quicksort中选择算法的一个配置。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   col1  col2\n",
       "1     1     3\n",
       "2     1     2\n",
       "3     1     4\n",
       "0     2     1"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Mergesort是唯一稳定的算法\n",
    "\n",
    "sorted_df = unsorted_df.sort_values(by='col1',kind='mergesort')\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.6 Pandas合并/连接\n",
    "Pandas具有功能全面的高性能内存中连接操作，与SQL等关系数据库非常相似。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.6.1 merge函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True)\n",
    "- left: 一个DataFrame对象\n",
    "- right: 另一个DataFrame对象\n",
    "- on: 用于连接的列名，必须在左和右DataFrame对象中存在的列\n",
    "- left_on: 左侧DataFrame用作连接的键，可以是列名或长度等于DataFrame长度的数组\n",
    "- right_on: 右边的DataFrame用作连接的键\n",
    "- left_index: 如果为True，则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下，级别的数量必须与来自右DataFrame的连接键的数量相匹配。\n",
    "- right_index: 与left_index用法相同\n",
    "- how: 它是left, right, outer以及inner之中的一个，默认为内inner。\n",
    "- sort: 按照字典顺序通过连接键对结果DataFrame进行排序。默认为True，设置为False时，在很多情况下大大提高性能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   id    Name subject\n",
      "0   1    Alex    sub1\n",
      "1   2     Amy    sub2\n",
      "2   3   Allen    sub3\n",
      "3   4   Alice    sub4\n",
      "4   5  Ayoung    sub5\n",
      "-----------------------\n",
      "   id   Name subject\n",
      "0   1  Billy    sub2\n",
      "1   2  Brian    sub4\n",
      "2   3   Bran    sub3\n",
      "3   4  Bryce    sub6\n",
      "4   5  Betty    sub5\n"
     ]
    }
   ],
   "source": [
    "# 构建样例数据\n",
    "left = pd.DataFrame({'id':[1,2,3,4,5],\n",
    "                     'Name':['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],\n",
    "                     'subject':['sub1','sub2','sub3','sub4','sub5']})\n",
    "\n",
    "right = pd.DataFrame({'id':[1,2,3,4,5],\n",
    "                     'Name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],\n",
    "                     'subject':['sub2','sub4','sub3','sub6','sub5']})\n",
    "\n",
    "print(left)\n",
    "print('-----------------------')\n",
    "print(right)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "INSTALLED VERSIONS\n",
      "------------------\n",
      "commit: None\n",
      "python: 3.6.4.final.0\n",
      "python-bits: 64\n",
      "OS: Windows\n",
      "OS-release: 10\n",
      "machine: AMD64\n",
      "processor: AMD64 Family 22 Model 48 Stepping 1, AuthenticAMD\n",
      "byteorder: little\n",
      "LC_ALL: None\n",
      "LANG: None\n",
      "LOCALE: None.None\n",
      "\n",
      "pandas: 0.23.4\n",
      "pytest: 3.3.2\n",
      "pip: 19.0.3\n",
      "setuptools: 38.4.0\n",
      "Cython: 0.27.3\n",
      "numpy: 1.16.2\n",
      "scipy: 1.3.1\n",
      "pyarrow: None\n",
      "xarray: None\n",
      "IPython: 6.2.1\n",
      "sphinx: 1.6.6\n",
      "patsy: 0.5.0\n",
      "dateutil: 2.6.1\n",
      "pytz: 2017.3\n",
      "blosc: None\n",
      "bottleneck: 1.2.1\n",
      "tables: 3.4.2\n",
      "numexpr: 2.6.4\n",
      "feather: None\n",
      "matplotlib: 3.1.1\n",
      "openpyxl: 2.4.10\n",
      "xlrd: 1.1.0\n",
      "xlwt: 1.3.0\n",
      "xlsxwriter: 1.0.2\n",
      "lxml: 4.1.1\n",
      "bs4: 4.6.0\n",
      "html5lib: 1.0.1\n",
      "sqlalchemy: 1.2.1\n",
      "pymysql: None\n",
      "psycopg2: 2.8.3 (dt dec pq3 ext lo64)\n",
      "jinja2: 2.10\n",
      "s3fs: None\n",
      "fastparquet: None\n",
      "pandas_gbq: None\n",
      "pandas_datareader: None\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "pd.show_versions()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject_x</th>\n",
       "      <th>Name_y</th>\n",
       "      <th>subject_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Alex</td>\n",
       "      <td>sub1</td>\n",
       "      <td>Billy</td>\n",
       "      <td>sub2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>Brian</td>\n",
       "      <td>sub4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>Bran</td>\n",
       "      <td>sub3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>Bryce</td>\n",
       "      <td>sub6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>Betty</td>\n",
       "      <td>sub5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  Name_x subject_x Name_y subject_y\n",
       "0   1    Alex      sub1  Billy      sub2\n",
       "1   2     Amy      sub2  Brian      sub4\n",
       "2   3   Allen      sub3   Bran      sub3\n",
       "3   4   Alice      sub4  Bryce      sub6\n",
       "4   5  Ayoung      sub5  Betty      sub5"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在一个键上合并两个DataFrame\n",
    "pd.merge(left,right,on='id') # 默认参数how是inner内连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  Name_x subject Name_y\n",
       "0   3   Allen    sub3   Bran\n",
       "1   5  Ayoung    sub5  Betty"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 合并多个键上的两个DataFrame\n",
    "pd.merge(left,right,on=['id','subject'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_x</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>id_y</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Alex</td>\n",
       "      <td>sub1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Billy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Brian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_x  Name_x subject  id_y Name_y\n",
       "0     1    Alex    sub1   NaN    NaN\n",
       "1     2     Amy    sub2   1.0  Billy\n",
       "2     3   Allen    sub3   3.0   Bran\n",
       "3     4   Alice    sub4   2.0  Brian\n",
       "4     5  Ayoung    sub5   5.0  Betty"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# left join\n",
    "# 左连接，左侧DataFrame取全部值，右侧DataFrame匹配左侧DataFrame\n",
    "pd.merge(left,right,on='subject',how='left')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_x</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>id_y</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.0</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>1</td>\n",
       "      <td>Billy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3.0</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>3</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.0</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>2</td>\n",
       "      <td>Brian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.0</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>5</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>sub6</td>\n",
       "      <td>4</td>\n",
       "      <td>Bryce</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_x  Name_x subject  id_y Name_y\n",
       "0   2.0     Amy    sub2     1  Billy\n",
       "1   3.0   Allen    sub3     3   Bran\n",
       "2   4.0   Alice    sub4     2  Brian\n",
       "3   5.0  Ayoung    sub5     5  Betty\n",
       "4   NaN     NaN    sub6     4  Bryce"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# right join\n",
    "# 右连接，右侧DataFrame取全部值，左侧DataFrame匹配右侧DataFrame\n",
    "pd.merge(left,right,on='subject',how='right')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_x</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>id_y</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>Alex</td>\n",
       "      <td>sub1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Billy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Brian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>sub6</td>\n",
       "      <td>4.0</td>\n",
       "      <td>Bryce</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_x  Name_x subject  id_y Name_y\n",
       "0   1.0    Alex    sub1   NaN    NaN\n",
       "1   2.0     Amy    sub2   1.0  Billy\n",
       "2   3.0   Allen    sub3   3.0   Bran\n",
       "3   4.0   Alice    sub4   2.0  Brian\n",
       "4   5.0  Ayoung    sub5   5.0  Betty\n",
       "5   NaN     NaN    sub6   4.0  Bryce"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# outer join\n",
    "# 外连接，就是左连接和右连接的并集\n",
    "pd.merge(left,right,how='outer',on='subject')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_x</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>id_y</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>1</td>\n",
       "      <td>Billy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>3</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>2</td>\n",
       "      <td>Brian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>5</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_x  Name_x subject  id_y Name_y\n",
       "0     2     Amy    sub2     1  Billy\n",
       "1     3   Allen    sub3     3   Bran\n",
       "2     4   Alice    sub4     2  Brian\n",
       "3     5  Ayoung    sub5     5  Betty"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# inner join\n",
    "# 内连接，就是左连接和右连接的交集\n",
    "pd.merge(left,right,on='subject',how='inner')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_x</th>\n",
       "      <th>Name_x</th>\n",
       "      <th>subject</th>\n",
       "      <th>id_y</th>\n",
       "      <th>Name_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>Amy</td>\n",
       "      <td>sub2</td>\n",
       "      <td>1</td>\n",
       "      <td>Billy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3</td>\n",
       "      <td>Allen</td>\n",
       "      <td>sub3</td>\n",
       "      <td>3</td>\n",
       "      <td>Bran</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>Alice</td>\n",
       "      <td>sub4</td>\n",
       "      <td>2</td>\n",
       "      <td>Brian</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5</td>\n",
       "      <td>Ayoung</td>\n",
       "      <td>sub5</td>\n",
       "      <td>5</td>\n",
       "      <td>Betty</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_x  Name_x subject  id_y Name_y\n",
       "0     2     Amy    sub2     1  Billy\n",
       "1     3   Allen    sub3     3   Bran\n",
       "2     4   Alice    sub4     2  Brian\n",
       "3     5  Ayoung    sub5     5  Betty"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当两边合并字段不同时，可以使用left_on和right_on参数设置合并字段。\n",
    "pd.merge(left,right,left_on='subject',right_on='subject')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>key_x</th>\n",
       "      <th>data1</th>\n",
       "      <th>key_y</th>\n",
       "      <th>data2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>b</td>\n",
       "      <td>0</td>\n",
       "      <td>a</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>b</td>\n",
       "      <td>1</td>\n",
       "      <td>b</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>2</td>\n",
       "      <td>d</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  key_x  data1 key_y  data2\n",
       "0     b      0     a      0\n",
       "1     b      1     b      1\n",
       "2     a      2     d      2"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可以通过设置left_index或者right_index的值为True来使用索引连接\n",
    "df1 = pd.DataFrame({'key':list('bbaca'),'data1':range(5)})\n",
    "df2 = pd.DataFrame({'key':['a','b','d'],'data2':range(3)})\n",
    "# df1使用data1作为连接关键字，而df2使用索引当连接关键字\n",
    "pd.merge(df1,df2,left_on='data1',right_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>key_df1</th>\n",
       "      <th>data1</th>\n",
       "      <th>key_df2</th>\n",
       "      <th>data2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>b</td>\n",
       "      <td>0</td>\n",
       "      <td>a</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>b</td>\n",
       "      <td>1</td>\n",
       "      <td>b</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>2</td>\n",
       "      <td>d</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  key_df1  data1 key_df2  data2\n",
       "0       b      0       a      0\n",
       "1       b      1       b      1\n",
       "2       a      2       d      2"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当merge合并后，pandas会自动在后面加上(_x,_y)来区分重复列，我们也可以使用suffixes来设置名字\n",
    "pd.merge(df1,df2,left_on='data1',right_index=True,suffixes=('_df1','_df2'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.6.2 concat函数\n",
    "pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,\n",
    "       keys=None, levels=None, names=None, verify_integrity=False)\n",
    "\n",
    "- objs: series,dataframe或者是panel构成的Series或映射\n",
    "- axis: 需要合并连接的轴，0是行，1是列\n",
    "- join: 连接方式inner,或者outer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df1 = pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8],'C':[9,10,11,12]})\n",
    "df2 = pd.DataFrame({'A':[100,2,300,4,6],'B':[500,6,700,8,100],'D':[900,10,1100,12,20]})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>900.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1100.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B     C       D\n",
       "0    1    5   9.0     NaN\n",
       "1    2    6  10.0     NaN\n",
       "2    3    7  11.0     NaN\n",
       "3    4    8  12.0     NaN\n",
       "0  100  500   NaN   900.0\n",
       "1    2    6   NaN    10.0\n",
       "2  300  700   NaN  1100.0\n",
       "3    4    8   NaN    12.0\n",
       "4    6  100   NaN    20.0"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 相同字段的表首尾相接\n",
    "pd.concat([df1,df2]) # 默认axis=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"4\" valign=\"top\">df1</th>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"5\" valign=\"top\">df2</th>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>900.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1100.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         A    B     C       D\n",
       "df1 0    1    5   9.0     NaN\n",
       "    1    2    6  10.0     NaN\n",
       "    2    3    7  11.0     NaN\n",
       "    3    4    8  12.0     NaN\n",
       "df2 0  100  500   NaN   900.0\n",
       "    1    2    6   NaN    10.0\n",
       "    2  300  700   NaN  1100.0\n",
       "    3    4    8   NaN    12.0\n",
       "    4    6  100   NaN    20.0"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用key来标识数据来源于哪张表\n",
    "pd.concat([df1,df2],keys=['df1','df2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>1100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B     C    A    B     D\n",
       "0  1.0  5.0   9.0  100  500   900\n",
       "1  2.0  6.0  10.0    2    6    10\n",
       "2  3.0  7.0  11.0  300  700  1100\n",
       "3  4.0  8.0  12.0    4    8    12\n",
       "4  NaN  NaN   NaN    6  100    20"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 当axis=1的时候，就是行对齐，然后将两张表的列合并\n",
    "pd.concat([df1,df2],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9</td>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11</td>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>1100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A  B   C    A    B     D\n",
       "0  1  5   9  100  500   900\n",
       "1  2  6  10    2    6    10\n",
       "2  3  7  11  300  700  1100\n",
       "3  4  8  12    4    8    12"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# join\n",
    "# inner 得到的是两表的交集\n",
    "pd.concat([df1,df2],axis=1,join='inner')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>1100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>12.0</td>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B     C    A    B     D\n",
       "0  1.0  5.0   9.0  100  500   900\n",
       "1  2.0  6.0  10.0    2    6    10\n",
       "2  3.0  7.0  11.0  300  700  1100\n",
       "3  4.0  8.0  12.0    4    8    12\n",
       "4  NaN  NaN   NaN    6  100    20"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# outer 得到的是两表的并集\n",
    "pd.concat([df1,df2],axis=1,join='outer')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9</td>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11</td>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>1100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A  B   C    A    B     D\n",
       "0  1  5   9  100  500   900\n",
       "1  2  6  10    2    6    10\n",
       "2  3  7  11  300  700  1100\n",
       "3  4  8  12    4    8    12"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果有join_axes的参数传入，可以指定根据哪个轴来对齐数据\n",
    "pd.concat([df1,df2],axis=1,join_axes=[df1.index])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py:6211: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  sort=sort)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>900.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1100.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B     C       D\n",
       "0    1    5   9.0     NaN\n",
       "1    2    6  10.0     NaN\n",
       "2    3    7  11.0     NaN\n",
       "3    4    8  12.0     NaN\n",
       "0  100  500   NaN   900.0\n",
       "1    2    6   NaN    10.0\n",
       "2  300  700   NaN  1100.0\n",
       "3    4    8   NaN    12.0\n",
       "4    6  100   NaN    20.0"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# append是series和dataframe的方法，使用它就是默认沿着列进行拼接（axis = 0，列对齐）\n",
    "df1.append(df2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lenovo\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n",
      "of pandas will change to not sort by default.\n",
      "\n",
      "To accept the future behavior, pass 'sort=False'.\n",
      "\n",
      "To retain the current behavior and silence the warning, pass 'sort=True'.\n",
      "\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>9.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>10.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>11.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100</td>\n",
       "      <td>500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>900.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>300</td>\n",
       "      <td>700</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1100.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>4</td>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>6</td>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B     C       D\n",
       "0    1    5   9.0     NaN\n",
       "1    2    6  10.0     NaN\n",
       "2    3    7  11.0     NaN\n",
       "3    4    8  12.0     NaN\n",
       "4  100  500   NaN   900.0\n",
       "5    2    6   NaN    10.0\n",
       "6  300  700   NaN  1100.0\n",
       "7    4    8   NaN    12.0\n",
       "8    6  100   NaN    20.0"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# ignore_index参数为True，合并完后的表，再重新整理一个新的index\n",
    "pd.concat([df1,df2],ignore_index=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.7 Pandas迭代"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas对象之间的基本迭代的行为取决于类型。\n",
    "- 当迭代一个Series时，它被视为数组式，基本迭代产生这些值。\n",
    "- 其他数据结构，如：DataFrame和Panel，遵循迭代对象的键。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.7.1 迭代DataFrame\n",
    "迭代DataFrame提供列名。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A\n",
      "x\n",
      "y\n",
      "C\n",
      "D\n"
     ]
    }
   ],
   "source": [
    "N = 20\n",
    "\n",
    "df = pd.DataFrame({\n",
    "    'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),\n",
    "    'x': np.linspace(0,stop=N-1,num=N),\n",
    "    'y': np.random.rand(N),\n",
    "    'C': np.random.choice(['Low','Medium','High'],N).tolist(),\n",
    "    'D': np.random.normal(100, 10, size=(N)).tolist()\n",
    "    })\n",
    "\n",
    "for col in df:  # 迭代DataFrame提供列名\n",
    "    print(col)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "要遍历DataFrame中的数据，可以使用以下函数：\n",
    "- iteritems()：将列迭代为(列名,Series)\n",
    "- iterrows()：将行迭代为(索引,Series)\n",
    "- itertuples()：将为DataFrame中的每一行返回一个产生一个命名元组的迭代器。元组的第一个元素将是行的相应索引值，而剩余的值是行值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "col1 0   -2.981358\n",
      "1    1.542898\n",
      "2    0.034994\n",
      "3    0.403110\n",
      "Name: col1, dtype: float64\n",
      "col2 0    1.191964\n",
      "1   -1.765181\n",
      "2    1.338140\n",
      "3   -0.909445\n",
      "Name: col2, dtype: float64\n",
      "col3 0    0.691264\n",
      "1   -1.294775\n",
      "2   -1.079091\n",
      "3    1.267020\n",
      "Name: col3, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# iteritems()示例\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])\n",
    "for key,value in df.iteritems():  # 遍历每一列\n",
    "    print(key,value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 col1    0.331482\n",
      "col2   -0.082465\n",
      "col3    0.901383\n",
      "Name: 0, dtype: float64\n",
      "1 col1    0.457225\n",
      "col2    1.749560\n",
      "col3    1.179433\n",
      "Name: 1, dtype: float64\n",
      "2 col1   -0.388538\n",
      "col2    0.299423\n",
      "col3   -0.372152\n",
      "Name: 2, dtype: float64\n",
      "3 col1    0.659592\n",
      "col2    0.073732\n",
      "col3    2.732768\n",
      "Name: 3, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# iterrows()示例\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])\n",
    "for row_index,row in df.iterrows():  # 遍历每一行\n",
    "    print(row_index,row)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pandas(Index=0, col1=0.48602901733344783, col2=-1.5539391457438123, col3=-0.04430705476956224)\n",
      "Pandas(Index=1, col1=-0.9228596975040277, col2=-1.0228389027349492, col3=0.3386591733220599)\n",
      "Pandas(Index=2, col1=0.921381562496179, col2=-0.8499061523092819, col3=0.04792091892126008)\n",
      "Pandas(Index=3, col1=0.4704347338291297, col2=-0.4652555976370797, col3=-0.5262806115372778)\n"
     ]
    }
   ],
   "source": [
    "# itertuples示例\n",
    "df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])\n",
    "for row in df.itertuples():\n",
    "    print(row)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意 - 不要尝试在迭代时修改任何对象。迭代是用于读取，迭代器返回原始对象(视图)的副本，因此更改将不会反映在原始对象上。具体如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>col1</th>\n",
       "      <th>col2</th>\n",
       "      <th>col3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.486029</td>\n",
       "      <td>-1.553939</td>\n",
       "      <td>-0.044307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.922860</td>\n",
       "      <td>-1.022839</td>\n",
       "      <td>0.338659</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.921382</td>\n",
       "      <td>-0.849906</td>\n",
       "      <td>0.047921</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.470435</td>\n",
       "      <td>-0.465256</td>\n",
       "      <td>-0.526281</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       col1      col2      col3\n",
       "0  0.486029 -1.553939 -0.044307\n",
       "1 -0.922860 -1.022839  0.338659\n",
       "2  0.921382 -0.849906  0.047921\n",
       "3  0.470435 -0.465256 -0.526281"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for index,row in df.iterrows():\n",
    "    row['a'] = 10\n",
    "df  # 观察发现，修改变化并未反映出来"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.8 Pandas字符串和文本数据\n",
    "Pandas提供了一组字符串函数，可以方便地对字符串数据进行操作。最重要的是，这些函数忽略丢失/NaN值"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuEAAAIWCAYAAAD511MzAAAgAElEQVR4Aey9DWxV15n3+yelScpNFA2Uj+LUg/mQEIyIm5z0bW1ENQQbyUmPq6tMlaYYgUGVosE+SC2vRAEjTBg0l1biGEaRRuAgQ2nUW70aO4klMKEKwm6nOVCDGoREwB6nENsEKpTcNC00vnrW2mvvtffZ58P2Ofax/bcEZ+31+azf/nrWs5619rShoaEh8I8ESIAESIAESIAESIAESGDMCDw0Zi2xIRIgARIgARIgARIgARIgAUWASjgvBBIgARIgARIgARIgARIYYwJUwscYOJsjARIgARIgARIgARIggelhCG7cuBEWzTgSIAESIAESIAESIAESIIEREli4cKFbMlQJl9Qnn3zSzTRRAn/6058mpNwThS/lLCwCvN4L63xQGhIgARIgARJIR0De2/Yf3VFsGgyTAAmQAAmQAAmQAAmQwBgQoBI+BpDZBAmQAAmQAAmQAAmQAAnYBKiE2zQYJgESIAESIAESIAESIIExIEAlfAwgswkSIAESIAESIAESIAESsAlQCbdpMEwCJEACJEACJEACJEACY0CASvgYQGYTJEACJEACJEACJEACJGAToBJu02CYBEiABEiABEiABEiABMaAAJXwMYDMJkiABEiABEiABEiABEjAJkAl3KbBMAmQAAmQAAmQAAmQAAmMAQEq4WMAmU2QAAmQAAmQAAmQAAmQgE2ASrhNg2ESIAESIAESIAESIAESGAMC+VXCL72GsrIf481BuyeXcKjseZSVvYY/2tEMkwAJkAAJkAAJkAAJkMAUIZBXJfyP598CcBW9H9k052HBt+X4Lfzmkh3PMAmQAAmQAAmQAAmQAAlMDQLT89bNwbdw7BdA2Y5m1H3tLfyk7DV0BRr75SvP45cm7of/hq5/fcoc8ZcESIAESIAESIAESIAEJi2BvCnhd977Dbq+/QrefPL/4Cf/r+YnCvnPnp8bgCnuKT/1lPFAKg9JgARIgARIgARIgARIYLIRyJMSfgkn911Vrijf/S1Q9u2l2gq+rxZl+yYbQvaHBEiABEiABEiABEiABIZHID9K+OCH+J8fvoLtN17Du6ub8bNn38NPvncVCLWED09g5iYBEiABEiABEiABEiCBiU4gP0r4nBewAc/jR78F8Nta/OSHLyhOXeks4eK6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ARIgARIgARIYFwJUwscFOxslARIgARIgARIgARKYygSohE/ls8++kwAJkAAJkAAJkAAJjAsBKuHjgp2NkgAJkAAJkAAJkAAJTGUCVMKn8tln30mABEiABEiABEiABMaFAJXwccHORkmABEiABEiABEiABKYyASrhU/nss+8kQAIkQAIkQAIkQALjQiDlFzPHRRo2SgIkQAIkQAIkQAIkQAKTlMDChQvdnqX8Yqadyc1d4IHg50ALXFyKRwKjIsDrfVT4WJgESIAESIAExpSAvLftP7qj2DQYJgESIAESIAESIAESIIExIEAlfAwgswkSIAESIAESIAESIAESsAlQCbdpMEwCJEACJEACJEACJEACY0CASvgYQGYTJEACJEACJEACJEACJGAToBJu02CYBEiABEiABEiABEiABMaAAJXwMYDMJkiABEiABEiABEiABEjAJkAl3KbBMAmQAAmQAAmQAAmQAAmMAQEq4WMAmU2QAAmQAAmQAAmQAAmQgE2ASrhNg2ESIAESIAESIAESIAESGAMCKb+YOQZtF1wTDz7/G7548AAYGio42TIKNG0aHpo+HdMffThjVmYgARIgARIgARIgARIYXwK0hDv8lQJ+//7EVMClD0ND+OL+fUg/+EcCJEACJEACJEACJFDYBHKkhPejtb4CkYjzr6m7sHsdIp2ygIfET7SoydKPica98OXtxsH6NtxJIeidthgiae7by00ViLX1B0rr+z45PpDNPezGwUgMrYNuRMqAkidE3lTxqSqS/FnJN9iGWEh7pt7w/ptU67f7sHoOHpx4j0CrEwySAAmQAAmMBYGcuKPcafs1sLMDiTkisrxotyG24Dji0Xlj0YfctJHGBeVu22707rmm21m/A0/HluemzaRa3sfVZ36FL7fvwaK5TuLAaVzaB3y9qRIzk/KHRKTpR0huRk0ZAqWoWfM61tYDp5qimDWMfosCWtsiBWoQafQKrltfjRNdALr88SirS9FGKbYeWYJI1WGUJLZghVeVPzTYhsbGKwCuYG3kkJu2rqEOPSHxbnuiSFcdQqdbwgQC8mEZdrXHUa2eVyZPil9Rqje3orwh5HnmpIWVPLG5AieCCesPIFFfGozlMQmQAAmQwBQlkBMlfFZ0C6pdgKVYvR6o7RWr2QRSwl35kwMzo3swMwooZbwnOT03MbdxvX4f/ro7jqVG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pJo2DQ8/NiNdDqZNEgKjud4nCQJ2gwRIgARIgAQmDIHge/uhCSN5ngV9aHpuJgVGLqZY3HfgkT2HcV22LzR/A6fx8XVri0MTn+J3/PuRQjBGkwAJkAAJkAAJkAAJuATGW/N0BRnvwPRHH8YDAF88eDCOFvEQV5W5lXjK586SgtS0aRAFXPrBPxIgARIgARIgARIggcImQCXcOj9agaUSayFhkARIgARIgARIgARIIA8E6I6SB6iskgRIgARIgARIgARIgATSEaASno4O00iABEiABEiABEiABEggDwSohOcBKqskARIgARIgARIgARIggXQEqISno8M0EiABEiABEiABEiABEsgDASrheYDKKkmABEiABEiABEiABEggHQEq4enoMI0ESIAESIAESIAESIAE8kCASngeoLJKEiABEiABEiABEiABEkhHgEp4OjpMIwESIAESIAESIAESIIE8EJg2NDQ0FKxXvm3PPxIgARIgARIgARIgARIggdwRWLhwoVtZyi9m2pnc3AUekMHDRJS7wLFSvAIlwOu9QE8MxSIBEiABEiCBEAJBIzfdUUIgMYoESIAESIAESIAESIAE8kmASng+6bJuEiABEiABEiABEiABEgghQCU8BAqjSIAESIAESIAESIAESCCfBKiE55Mu6yYBEiABEiABEiABEiCBEAJUwkOgMIoESIAESIAESIAESIAE8kmASng+6bJuEiABEiABEiABEiABEgghQCU8BAqjSIAESIAESIAESIAESCCfBKiE55Mu6yYBEiABEiABEiABEiCBEAJUwkOgMIoESIAESIAESIAESIAE8kkg5Rcz89loodb94PO/4YsHD4ChoUIVMT9yTZuGh6ZPx/RHH85P/ayVBEiABEiABEiABEjAR4CWcAeHUsDv3596Crj0f2gIX9y/D2HAPxIgARIgARIgARIggfwTyL0S3n0YkUgFDnbnX/hctqAs4LmscALWRQYT8KSNQOQ7bTFEmuwbtB+t9RXqvpV7V/3zpaduJLmuYN5uHIwcxuVA9OWmCsTa+gOxgMS7MhhZMv1asip5QvPH0DpomtP9tZ9RqfqRSk5TU9rfwTbEjCxGRuf5mKqPtkxQ5ZPZqTZVPSnSAEh/wvi68qaTw8iqMiezcuuwAqn4WVlUMFW+jJwdlj4+wcqzOFbth1yP6YvKNWxfP6lzq/rr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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "具体字符串的操作函数描述如下：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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9oILP0Ny+MuG5Qh+Et2f327PE0nnmfMn7kPMbYU4LIeZ3HiKY8Di7AiolTzbiu8o3dJeg/bHV1tEOsq8KubzVZedaiRvzNdMVZq2gruWcQ+OdkVyt8z0WNV+Uud+wdI+Dz55t+7DyRdPYX/suLEacuW3JxVWugQljyuLlZarf042JZe4psTsk25qy3ddmHzmN3idmHjvN3Du3fGexoj5gJLbd69UZEiVxbx84r6cnpfh+7PFNDjWI8ExkgTmj0Dcc5uKOICf/v0A5fa58vkbGnlqUpZ3+PYfX9KKuFpoOoRn7X3Z4xAtW4ann10Rl1rU+LgLuqiNLsbKHWXQ7E+9GEWkTI8DAVHwjgMHZ/CF0QXHkm+iawmUY4JSNs/LEt6fLZIMkoBLIO65XXTXFFeCRRx4Yvly/PLw4SKWsISiVe/G+sOHMZr5HBVm278SilPspmXLyV+ddfZ9z9OYjBv+lZhA7Kv3EsvF5h8zAhGuHouOgLX4M59sOdxUyuV5yftzvpPM9MVCgJoEgOXPPI1HAH559IiW8YiRqT7UYMUHj62ksg/KB4fy/i1bBrnJy7jhHwmQAAk8TgQW/fOS9+fHaTguib5SEXdOo1aqqFgtiVHNTpAACZAACRSNAJ+XRUPLih9DAkXfvvAxZMoukwAJkAAJkAAJkAAJkEBeAlTE8yJiBhIgARIgARIgARIgARKYfwJUxOefKWskARIgARIgARIgARIggbwEqIjnRcQMJEACJEACJEACJEACJDD/BKiIzz9T1kgCJEACJEACJEACJEACeQlQEc+LiBlIgARIgARIgARIgARIYP4JUBGff6askQRIgARIgARIgARIgATyEqAinhcRM5AACZAACZAACZAACZDA/BNYNj09PW1Xe/fuXfuQYRIgARIgARIgARIgARIggTkS2LBhQ6iGyC9rRmUMlVxkETKBKEe5FxlGilMmBDjey+REUUwSIAESIAESABBn6KZrCocHCZAACZAACZAACZAACZSAABXxEkBnkyRAAiRAAiRAAiRAAiRARZxjgARIgARIgARIgARIgARKQICKeAmgs0kSIAESIAESIAESIAESoCLOMUACJEACJEACJEACJEACJSBARbwE0NkkCZAACZAACZAACZAACVAR5xggARIgARIgARIgARIggRIQoCJeAuhskgRIgARIgARIgARIgASoiHMMkAAJkAAJkAAJkAAJkEAJCER+WbMEcpS8yUc//IRfHj0CpqdLLgsFKIDAsmV4YvlyLH/m6QIyMwsJkAAJkAAJkAAJLD4CtIgDUEr4w4dUwhff+IyXaHoavzx8qM5dfCamkAAJkAAJkAAJkMDiJTCPFvEJ9HUcBw5m0LgmrsPDOJk8gAstJ5DtqI7LtODxyhK+4K2ywfkgoM8dreK5WRZybQIYPo3k3j4Am3BoQK5j53rNXbmV2oiebDs2qxhpsxkjrYPY717qUt9V1Dp5bnbX4crrdrpVVTA41Y/0u0Bn92u42tGMoy8G7yG6vSs7epFJrfOVlnbOrg/H+zLNw8Fs28lXTtJbz/sFbGppxIXzcq4i/gL313v9aewc3RO65+ZrF4gYN3IeGj5CrRof4bajZA3ncmK27sPF7hRWxWZgAgmQAAksfQLzo4jbD/AczO71v4cLOdJLllSIO8rwOdxou+SIWIXnB45g41rncPIS/tFwDj+3vINX0i/PvhvSRs8LWN9dj5WBWu73H8boyJ/nVn+gzsV6KH39Cu34fWp1fhELOXf5a1niOdahsbUKyYbTSCglWCutR68Fui2KUXYQqzCBe1MmzSjl5jjmVyloY9GJKu0UhpzUC0lLgTxfp+8JM1DKth0cRM8HdUj3e8r1vf7jUP251oxklydG05kTwHlgCP54BJRVr0QBIXdSYCuRw7hyvhFtWf8kIFSb3Ct7KvMooP5JzOaOQWQ7/HEyabrwZViR1Uq33eoErl6+haZWdzbkJBYg7/BfcBTbcdE2rKxJITMApBvqMHImehJV0+mcFx+nsPzJHltOhkmABEjg8SQwZ0XctbYMVCpLSSzGqX50dQE1W+WhWG5/n+OLtktYcfZ9vBR8ni1EV4bPYfRIAmuvz0HJj5BzPPMWvk1kYhTeb3CnI42HrQvf55WpP2NqSxpfVC582xGYlkZUdTsudqbR1T+BTEp3qSlGkQLWYZWtfM2VgChvWWk0l0VcFLU6rUznaG9n0k5sRnL0BLK7xtS95dDACYw0vIeEZa2V+1PvmV4c6mlGlLXcrq3gsPSn9TSSydPuGwBtZLgF3yTDrbDAyYybf2YB9x4cfMtoT4CuORMe6LcWFcooEpTXL+fNT/rQ1NqLqzHnZWivqRNwlW8AQ13+Sc/O5CmvQ64cALbu8+IZIgESIIHHlMCcFfFVqQyyAm8qxhqmwE6g791TQGcv2kaby08RnxzHj6jHb+OU8LX1+P31+iINIW8SUFGkFhZftS/jpYHd6i3D+PXdeHz6XdwzIddqRjUxMYuGtEUzZEV3FDvtjqKr9bknKMWrEYc6b+No1y2VwaesikXcsYY3dg+iMVYyvxJvZ7vZfQCJM4PaJW5gO9Lv9mObcnkYRu/l7WjuXodV3YNIdNfh5HC0Fdeur6BwdTuyZ04jLRObP37mTAQcGewKlDI8hsR8Tmzs+vOFfW8aNEMoo0gVerIZx41IKpHze9yrbaofZ89vQu2udch9XrwiEtLWe3+cTBS68HbIZcifi0ckQAIk8HgSmLMiXgg29doY+3AxtQ7j3YWUWGR5/vk1fo4RSazKk47/5pOHA9ZlcTX5+FWsT3yI0SO3VQ3BPMrlxElTGWp2+1q63/8hHojLS3ASMOO6PXcaf5tp3DjiNOm41th9wtBbuOEk27L766jHWkthNpb2/8Rpt9/e24TP8cWWv+G5gRfwrbjzSN01u8PuOGvr8duWt/Bt/59QUYiLio8aDwohcMGyaPry+5Q3O8VvMRWFLt0QnoArZWyXpJ1SCrL4iIsyZltN3Vod9wX3eBYBaW+zuHxYLi+2FfaCbZE9XwfEvgmYYePV7ciovn0EdL7trI0RZdezyt/79CMMtexxJkBO/ddOwZZPx/qtyBLX1KpTlMXbmcTAmdj0nHHqmvHPbZx9t08ZRezJk78abTgZwibUqgTp04FIbmrSBe2v75PTXyEQdA0y6XNxETJ18JcESIAEyphA8RXx4dPY2QUcGtD+lONlBMuvbAKTWy5hUuS3fMEr0u+jIg0o5TOqb+ePYVTyi1uJ8jP/K8ZTjpXXdTk5oq2+ykfcruQb/OvybaxojXFJsetWfuqncee/HN/1yUuYQjteua79rFVfjl3CffE/Tx3BypQjc4Rriu5TDteUgNyq7o5L+LXl2/7zkbTbb5Xe47StuncJkw2ivL+PCohifgxTw/VYGZhsVLxRj8mev+N+Kuwzb1NiODcBz0JtL6bchEOdVTjaBde9QmqRvGfXvzbnBXRKARU3hb1a8W2OcFlwpTYuCu5aEzfFDTSd6UVi622MTAGbo6zLYqHOtrv5JRC2xDp+yr5ccziQScQHlch0mDcN+s3gCICEqnYYvereZw3sCDk1c8/fXVunmyH1yJ9665hyZDeLX4dPO6n6p2Z9Ht90N3cV2rozeuLSvc1awDmBkWtabm042YQat0w1mjs3Yecnw9hfbfUF4mcONJ3RcVpOt5AbCJ8HN4kBEiABEnjsCRRZER/Gyb19EF/U+J1UFu85MAqrVqDhs/oWLLVYe80CzupXsQIf4gfR5td+gzs92u883iZXmTgAACAASURBVPViCg+HqvDUOzGt2XWv/QOerTmHh/+UuuVfPV5yfIGl9Mr/qsFXR77G/8ZUNZPo8Y/9ciuf7iMf4l+T9VhpFrBasoXbFuu8cTl5Gc+1AN+OfQNUBxZn/u4FPDk0PzLPpH9LLa92F3DcElTnHKXroHavSCbrlLVa3MZaxboZ2HVk5jy0AirrQRKtvUj0pNH7ot+P2K3TtohbSmqU8nbzxVu48jWAKEU8VomPszTHudq4kkUHrLcFNz8Q3+cTuCfKssn99RiGcAv4dAKNqWrsz2pnIJMsSnf+nWLWYduOTTgaUnxNLf7f8dFbwHp/nHsUsr43aiu3rBkYSyPZsd1aOFqlXGjGR4FDB/cof3tTz6o/bkdN11Xc7Kj23FmGr2q3Ils3Vy4uzRG+/sHzYE8KTSv8JQESIIHHj0BRFXF3l5TQK/ADSCpLyjz5ay7V86Z804GnZtC/H12FVlu0v/OtjJ0PP/Zv8MMd4MF5z2VFi1eF5y05n9zxB2/nF+VDbyUWGlxbgV9hyJm4FFqI+fISUAqUsxvGGrEkv6m2Gmy9JsqRT6vKW1VUBrnuRzr3oPbyAYxAfIwzyjq9M7CIzy1rLOJuRHSgYv0mjIxNANVh668sLAy6vkQp817NM/N99so5IfGh/nIfOrurPSVclNAeMTycAHo+w72UvatKqIZ5itBWadkV5mTlIPabNTumdmviYBbLmiSxYF+ELOB9zV3AK2mbO8R3fBgnTUb5XfMaareewpXhdmx2hohivqPX6r9XIH4hsOSxJ4VeGYZIgARI4HEkUFRFPOpVpXpN7vgUPo7AZ9RnpYjOqAR+VamtyuOZNL7Dbqy/7rh1KNcVMSfOz5/n8z0/9UXWoiYiCTxnrOyRmRg5MwJaWaxRCpRnFRbF6eKONHY61vHgXty6jVs42lCHo74GG9HmOwbGR6vQ1rEOI5e9BPtekFtB9soEQ6sqqzBkK7hiBVdbAb6GkS+BofNBq6vUEBU3d2usWMMTrbLVo/enXDpkf/Pqatzb8Z6j4IYnDV6J2YQ8F5Vst3a/ubC1EU2wtoQULp9sQ3ZX/vrlvBS2gDdopZcJwCbUDkT3L3b9gSuSY5l3jxkgARIggceTQFEV8ccTaaG9Xo1nNgLfffw5UP0yIIqy7FPuW6y5Bk/V3PbcTXJUfb//NL4bqsdaezHsxgrHKv0N7hyThZF+i/ivE1X4+XKcD3ZAPrft1fjNjiqMtp1D0Xc0kUWyNS/g127bDMyZgNobeh96cBzJ5C3lNiYKnfqrziD7R1lkeRx9f4z6MFehizXFV3vC9XH2PhRkSx9QkH2WWzufFa7ehqZrB9A7nFIfCbo3dht4cRtWKau7teOKWkT6ERItwMj6wG4djitMvDuY1V5ccPg0WmUP7w4vg0wudnbJTiTGX/pt1HY4Vuq5v2SAt0/6cRwaGMR+cc9x19+8Cbzb5/H2xCo8NDWWt7zPPUXeqrTsQTbKTUgWmuZcEBu2iCsDjVr0PvdJUuGdZk4SIAESKD0BKuJzOgd6oeEDtw69A4m9u4ibFBGoSL+D77ccww31AKrH2oHd+PaYndFRen0LHa30oXMY3XIOoyrKv3NJxa7d+LbB1A2sOLxb+VtbpbEy1Y5/XU57dViLUCWfXz7A9Et854HDGN3yll68Kpmjdj6xG5tFWHzRn9yR8VxcZlEHi5gvZgKy00ar+zGZFNTW3kFA7p7fwQTtYuKLVXl9MdEHAd9vUVhlO8Mreba08+1H7Sjq+880IqkWgPYicTnwoRqlgJ/CkOQV32y1bZ6IpHf9cD8m1nLCZ8mOFjo+Vu+vbazhzlsF2RUqa7uiCK9etTd6MvAV0GhrcWBiIs23aBmUkiqKfzbjyq0VVzMxmrDt4ZAJSs36NwGMAXE+4sHuiW/71kp0BuPtY/d8Oy44rf7FsXbWGYXVVolaAYcsFu5/k1sdzgggM5MACZQzgWXT0/5PE969excbNmwouz7NRe6fvv+fRdxfrewj+DEhtcNK9Fc4F3FnChfNcaX5rbUtYlzhp5/7j7ikJRs/k/F+szuNkV2OhVvcFtRn7POgUdvKQW1b5yqweYrAt6e450JR+4n3iXbbj1tbkfXe4vJxl5MvnsJ+ZytQO1+oWbcPnvKmPgEfsKrP1gUm1F5chKP4yx7mskVj3N9s3PEUm4jP0ruTisC2fz6WcBR09CP9LtDpfkZeW6JrY76u6rdiS17ZhlEWbR7I/0Xkrf8v/g/+f/x/wa+1xkFx4wPn0DeG3EwMkAAJkEDZE4h7blMRB/DTvx8A/vnI4jrhatvDwK4tS1oRj5l8RJ2VZcvw9LMrolKWdFzcBT2/nTbKWJSbSqAlpZSOoU0peYE0HpIACZAACZDAY04g7rn9xGPORXX/ieWL3EOnejfWHx7BZObzx+J0yUeMfjycwUs5rIwGxKI/d0bQsvzV2+8VtPWoclto97a2K8v+UmgSIAESIAESWFgCi1wDXRgYy595Go8A/PLo0aK1jKs9zW0c1bvxillkZ8cvgXCor1F9WrYMooTLueMfCZAACZAACZAACZQjASrizlnTCh2VunIcxJSZBEiABEiABEiABMqRAF1TyvGsUWYSIAESIAESIAESIIGyJ0BFvOxPITtAAiRAAiRAAiRAAiRQjgSoiJfjWaPMJEACJEACJEACJEACZU+AinjZn0J2gARIgARIgARIgARIoBwJUBEvx7NGmUmABEiABEiABEiABMqeABXxsj+F7AAJkAAJkAAJkAAJkEA5EqAiXo5njTKTAAmQAAmQAAmQAAmUPQEq4mV/CtkBEiABEiABEiABEiCBciSwbHp6etoW/O7du/YhwyRAAiRAAiRAAiRAAiRAAnMksGHDhlANkV/WjMoYKrnIImQCUY5yLzKMFKdMCHC8l8mJopgkQAIkQAIkACDO0E3XFA4PEiABEiABEiABEiABEigBASriJYDOJkmABEiABEiABEiABEiAijjHAAmQAAmQAAmQAAmQAAmUgAAV8RJAZ5MkQAIkQAIkQAIkQAIkQEWcY4AESIAESIAESIAESIAESkCAingJoLNJEiABEiABEiABEiABEqAizjFAAiRAAiRAAiRAAiRAAiUgQEW8BNDZJAmQAAmQAAmQAAmQAAlQEecYIAESIAESIAESIAESIIESEIj8smYJ5Ch5k49++Am/PHoETE+XXBYKUGICy5bhieXLsfyZp0ssCJsnARIgARIgARJYygRoEQeglPCHD6mEL+WRPpO+TU/jl4cP1biYSTHmJQESIAESIAESIIGZEJhHRXwCfR1p9E0Fmx/GyWQdkr5/p3EzmK2Ex8oSXsL22fTiJLB0xkXctRngPnzauU7NdRx17QavZfvYvq6lzTqcHLbbkPq8PDe7g+l23kB4qh/pjn7cg6432e2rWGW+159GVLy0k+6fCFQYcej03y+z5HPaTMbXU3AbEc3mKyvp/vtnHU52m3MVTgsymDEXdxxE1J0MnDM5L9Y5jegepP2C+EcVZhwJkAAJLHEC8+OaIjfuvX0ANuFQJLBNODSQQeOayMTSRxbijjJ8DjfaLjmyVuH5gSPYuNY5nLyEfzScw88t7+CV9Muz74+00fMC1nfXY2XeWj7HF1uO4YHKF5BH4oxMKr0ea6/vRkVcnTNqN66S8oi/338YX6Edv0+tzi9wIeMify2LIMc6NLZWIdlwGolsOzYrxbIZR68FRNu6Dxezg1iFCdxzJ9QFXruikDWMBSp0DlXaKQw5hxeScq9w/s7X4YIEpe3uFFaZ+By/2w4OoucDUYp7kUmtc3JO4OrlW2hqrQ6UHMaV841oy5p8/mRRclvPO3FW//s6/Hyazgwi2+0v6x1JG5tQOxDdhpcPgNwreyrz9FUU/2aMtA5ifzWwuWMQ2Q5/nNRz4cswM1F6d47aLc6CS3U7stl2VYnwufK6lsOtVSnfY2hTY8mN1X1TzwErzg02I9nlHrgB4Sp95B8JkAAJPK4E5qyI6xv/HmQHKpFu+GiJcvwcX7Rdwoqz7+OlRfPQeBkvXX8fgCjkH4a5r63H76/XOwr51+F0EyMKe9sInh/YXYDybwrl/x3PvIVvE5kYhfcb3OlI42HrwvNcmfozprak8UXlwredn1oRc1S342JnGl39E8ikdDvxStA6rJrPSfOaFDJZaVQs4ldR6yhwfiVPW51Dk4MAkp1JO6IZydETyO4aQ7rBUfSvOYo9GtGTbUdF/3u4gFvwKf9iMLAMAzWdtkLv1R/HR93zum55GU2ooQ5HTTj423IC2Y7i3Dzce3CwfnsCNAsucr5kElPbEexMzLGlwNs5RL4uvG1NmuxUhkmABEjg8SYwZ0V8VSqDrDCcirOGjWEEQKKcOU+O40fU47dxz1Gj9JZdH7/BnWPngMMZz7pfdn2YqcAv46WB3eoNxniutwQzrbYM8su1mlFyFuCmEeqPtsiGFWWt8G628vuszEoBbMShzts46iivPqVYLOKONbyxexCNVj3+oF+J96XJvcdnUdd5MdWPrq4q9GQz8OSTfhz3FZ/pgbrnOZOZ4ORipnUVPf8cuNyLmMSoScsf46X2nXtftgiLuE82X2YekAAJkMBjQ2DOinhhpKqQmE8LW2GNzl+uf36Nn2NqE8vvpPNq+8nDAQuwuHx8/CrWJz7E6JHbqoZgHnGVMGkqQ81uqyXb/QTAXF1frJpVcPiv+A67sT7kpiHt/g3PDbyAb8XlRjLX7Pa5zPjl9lxj/PFp3DjiNOrIbvPC0Fu44ST7uORyAzJuNO8AXxnZXC755VbNra3Hb1vewrf9f0JFqO+OQI/Bz4W9xnoc6GysguS3JIuiG+WOolwpdknaKSQc1wOxikZanqWOdwPtz8vhbZx9tw/o7LWU8OiKh7psJVEmFm9GZwzFilJ/QLnW+CYXvnzhiQquncLO5ClfLsCWQSc1tepfnwXemdj0nAkUL/iwUC7D6O0CDg0MOi6FeiI2Upnb/Ua70fiFoUXcz4NHJEACJGATKL4i/vUYhtCHIdcvNPAwt6VZZGG/UglMbrmESZHRVfyAivT7qEgDyhUjSv7zxzAq+a+/DCgF868YTzn+2sPnMHokgbXXj2j/baVkepWMZ/6G566/j5dUlFbKv3hj/lwqxj++hCd3ZGJcUi5hskF8y99HBbQryVf9f8BKUVwnL2EK7XjluvazVpyOXcJ98W1PHcHKlMMjwjVF88rhmuK6yryvrfTCpOEcfNbroXMYNbIpX/gPcWeX8dm35dbMpobrsTLwNqPijXpM9vwd91OF+ON756QcQ56V0lYKN+FQZxWOdkG5cBiLseQ9u/61gny1c7G49+lHyid8aG8dcGYQzQD8Cq9Veus+feCuNbHSnGDTmV4ktt7GyBSwuaBJfRXaujPYLHV2b7PcQiYwcs3/hs6bIDiWdKfNyImKO0kxbwhspkG5/fWp1Aj3Dc3cdo9xlF6nOm2Bd+Icv3HxEbf/atbnVpC9vIVxUdbwlj3IGtZTn+HKtUa0iZ+8u37Aq1VC3jjzx+uj8ERDxRfRZSdKCsaRAAmQwGIjUHxFPPDgUdadhjRg+WguNihGHqNUagUauRc8mkLBX7EkmwWc1a9iBT7ED6LNr/0Gd3q033ncIsqKtG0dfxnPtQDfjn0DVBew0DAoR+j4G/xwB/jVG3F1iZXbLPBcjd/sqMJ3ogVhNbC2Hi+5r+aBlf9Vg6+OfI3/DbUx84j7/z0EHG73XGWq/4Tna9L4fng34CrTlmxr/4Bna87h4T+FqbRnpSEHs9+9gCeH5kfmmfdyYUtoK6WtFDrK6MF2ZM/o3TdEGW0bbUYrTiDrLoCcrZzamlqzFUi09iLRk0bvi8hvEbfuFVFW1Jsv3sIVWe5glENbvJCVuRG1ki6+8WNpJDu2WwskC3tD5/qIhxZYGqX4BJquHUCra2SwBTJhRw7nUJTV0OJHk9X9XYdtOzbh6CfD2F/tDno3NRgYH70FrA/GOsez4WJcegbGkE6+h9qBDBIfnMJQywnHtSm6rShruJ5k7EPiMtBc4GLc6NoZSwIkQAJLk0DxFfEAt1Wpt3HocjOufDqBxjk/8AOVL7VDZUE3O7Xozj15eL46OYWHso2F8/q7oFrvjOM+XsZKx0L+ndkGQxWuL6iKfJn+d+Q2fj5vubQ4BVbYctbU4DdmxxqsxsZuWbQ6w7+1FfgVhpxJ0QzLlnv24au4sHU7LopCu0Z2yHhT7dLRek2su/kVv3zdF2vqSOce1F4+gBGsQ2N3Rm1ht9PnAmLVYiziVlRUsGL9JoyMTQDVEdZf11ItJe1JByAW5YuQhaqvuQtV7fr9lnq/4mznM+Gb3WZHk2GcdBaFmjcKJo/+9cvhT5uvI1lQCQyhGScrB7HfrNkx1c+Cy80PPlLKt+yu0zkAdDXUYUgtcJ3Z2JDJlJ7YVeMe0tjZXanfTJg3H7SGm7PEXxIggceYwIIr4o8x65l1Xblo+HdqiXV/mVnNTu41eKoGeDiTshsrlBvLeCatfcuvO24dyj0kx84sM2kDgM9ffIZlC86uFuAm8Jyr0BdcsswzTqCvpw81O3rVNoVmmz6x/l7ckcbOZF205Vr1+haOhnYGaURbgMj4aBXaOtZh5LKXYC9wjLJ2eznjQ6sqqzDU8xnupZxtDo2l+mB8GZMi7YcXqk5g5EvAtXwbBV65YWxCbUy9Yvn1FO++GVnEjTyz/zXWeL2dorC8sLURTbC2hBQun2xDdlf+VqK4bO4wi1vXYRUq9UL7zrdnsP2slvHoNXFD1Mq7tNOj9kMX174T7vaI+SVkDhIgARJY2gTm8YM+MaCmJnDPSrrXfxxHxdfwsbeGr8YzG4EHH3+u6TiKt4VKuVk89TsnZvicuyjUn2e2R7r9H8XVJd/f5CV8deQ2Vrxh7ZHuKOUQ6/gxZ0GnVc+vE1X4+fLfcd+K84KBvnsJEN/tn4+cxh3ljG8lzHdQFuDWvIBfz3e9i72+4b/gKPahDceRTGrLbjar93JWyvLAPqDreMSHuaRjolgNQvKrfwP7UBPR380dsle59SeKofVBr51dt7S/uBWXVB/rscpEBau3oenaKfQ63/K5N3YbeLFyZv7sU3oXJ129uOhsQuIF01g19suWh+LfvnU7tkW5wJis7q+8RbCY+MIn0OTmm1tA3zeBC3uPAwedvbeHT2OnLKg8+Obcd6XycTGyikX/AC6IS4p9v1bbUQbOsVtEzrXI2ItDW02k/pUJzMXOTcD590LjS1xY9BjxPvjkL80jEiABEliaBBbAIv4ZupLexzyQ81VuuUHWiwH1R3VEdu1SUahFtyL9Dr7fcgw31K4r9Vg7sBvfHnMYqJ09zmGywdlZpGY3nm8B/m0QBd1WVL643UvMQlP/h33UgsU2a/GoqVv93sZ3pm3At4d6xa7d+LbByA2sOLxb+VvbxVem2vGvy2mMbjkH9X0Ra4Gr5PP33bKCV+/GK2dlgaa3owrgl9tuZ7bh3AtVZ1vrIi2nXAEA2Wmj1f2YTApqa++gyO6e38EE7WLii1V5fTHRBwHf751dVWo7wyt59pb2uYw4Lhb7zzQiqRaA9iJx2XzAZwzhnUhiXExk8fjWSnSKpLaLjpFc+UfLbiGFfVzIFIv8jVRuRZmO2q0mYjFji65VLYKUj/dkM+6kQ8WdNwvfJ2x7OGSCUrNedn6ZJRdpVo2ZPvV2pNA1A0omWWOgPgZkZHKUedl4Se3XnkE2JRbzOiTlg1JiHd81hrPn9aJXyGLh/jf9in8kXEaSAAmQwNIgsGx62v/5wLt372LDhg1l17u5yP3T9/9Tdv2dH4H17iX/3hHYdtH5SNBT9tdD56fBxVGL40rz2wL2EX/6uf9YHDIHpJjJeL/ZncbILufLto6CFagufKj8d6EtouHUmBh7BxHPhaL2E+/rld4OJXD8xp0P42zdh5MvnsJ+ZytQO1+oMbcPTnvOFoid7mJA7ZutPxxk3CS8WowriiiO/oWTnsy+rz1Ke+4ExqvH+KKbDxTplEB7s/SDFpeTnaN7rN1eTLueldr+QJDK735kyFHQobeGnCkX3a/3kIhdUF9AH92PCdljwvQh/KsnFhJfWP5wDYwhARIggcVNIO65TUUcwE//fgD45yOL+2zOp3RKKR3Csz6lWyz9H2JpKuL6LQYK+UrqsmV4+tkV80l73uqKu6DnrQFVkSh9uRQyqzVnT/HQZ8+tLAySAAmQAAmQwONKIO65vQCuKYsf+RPLl+OXhzNatrj4O1WohPJV0LNf44bZB7zQcmWa737/h/hRPrxUwAYQMi4e7z/xmdZLHPNyKNRNJW9FzEACJEACJEACjw+Bx13TUGd6+TNP4xGAXx49ejwt4+KXLR/qcP9exkvXzScx3cglEVB7w+frybJlECVcxgX/SIAESIAESIAESKBYBKiIO2S10kXFq1gDjfWSAAmQAAmQAAmQAAn4CRR/+0J/ezwiARIgARIgARIgARIgARIAQEWcw4AESIAESIAESIAESIAESkCAingJoLNJEiABEiABEiABEiABEqAizjFAAiRAAiRAAiRAAiRAAiUgQEW8BNDZJAmQAAmQAAmQAAmQAAlQEecYIAESIAESIAESIAESIIESEKAiXgLobJIESIAESIAESIAESIAEqIhzDJAACZAACZAACZAACZBACQgsm56enrbbvXv3rn3IMAmQAAmQAAmQAAmQAAmQwBwJbNiwIVRD5Jc1ozKGSi6yCJlAlKPciwwjxSkTAhzvZXKiKCYJkAAJkAAJAIgzdNM1hcODBEiABEiABEiABEiABEpAgIp4CaCzSRIgARIgARIgARIgARKgIs4xQAIkQAIkQAIkQAIkQAIlIEBFvATQ2SQJkAAJkAAJkAAJkAAJUBHnGCABEiABEiABEiABEiCBEhCgIl4C6GySBEiABEiABEiABEiABKiIcwyQAAmQAAmQAAmQAAmQQAkIUBEvAXQ2SQIkQAIkQAIkQAIkQAJUxDkGSIAESIAESIAESIAESKAEBCK/rFkCOUre5KMffsIvjx4B09Mll2VRCbBsGZ5YvhzLn3l6UYlFYUiABEiABEiABEig3AnQIg5AKeEPH1IJjxrN09P45eFDxSgqmXEkQAIkQAIkQAIkQAKzIzCPFvEJ9HUcBw5m0LgmLMy9/jR2dt1yEjbh0EB0vnDJ4scoS3jxmynrFjQjWsXL+iT6hB/GyeQB4Mwg9lf7EgIHku8qarPt2OymyLXejJHWfGXdAgCknveQKOC6998r7DrscCN6fDLZaTp8s7sOZ9f3IpNaF07MEaPav7wdF7tTWBWVb6of6YZTGIpKi4xbXPe7SBEZSQIkQAIkUBIC86OID59Gcm8fgE04FNEN98GWzUQ/2CLKLGgU3VHy4yaj/IzKKkc19p9pRHLv6YCSnb8T9/qP4+g1ANfqcMHNnk8xlvaqkGw4jUQeBXp89BbQcgLZjmpA7i2fbNNh05Yowu8CFea4FL9b98Ur6j55HAOFL44HJEACJEACJKAJzFkRV0r26B5kByqRbvgozHWqH11dVejJxliXwiUYQwIkMI8E8lmYW5MyiQ78tZxADw6g9byOv5DsQ5NYz1/oR5dc71ljRtfW8Ss73vQs5nksxlHtqbpVlRMY+RJoanXqr25Hzyd1SHY7inlAzNIe5n4LWFrZ2DoJkAAJkEA5EJizIr4qlUFWejo1Ftnfe59+hKGWPchEpjKSBEig2ATUNZqyW7HdTXK5mQwi22HnHcbJDqCz2yjhwM3uZlzZEeH+MSOLcTNGXPEmMHJtExIH3Qhs7ujFoY7j6JuKdmfLPdFoRrLLq8uEajotmdXE4SPURrjNiHtL65cB6/eaFDLdUtMwRq7dwoWGOhw1FUf8qklGhLteRFZGkQAJkAAJPGYE5qyI5+Mlr5lr1gN9HXX6dbYUMK+d8xVeFOnf4E5HGt+5DqH1WHt9Nyqg4x+2vo+XPL0EwOf4YsuHeGrgCDaulWf1Odxou+T2ZMVZL//9/sP4Cu347Ugak47l0U6XQpJn9MjtyPK56s5b1pHf7VfLO3gl/bLbDgNLj4AorF14GxmfUu71U5TOK6/H+33f7D6AC9eAC8lTXiEVcpRdo3wbRdV1WQtkdw+1O0tj96CKUUqvcx0gSrkNxO0UOdS9JINsqE/GUm8p3G67/oBrLIhQljd3nEBT8gC6+l8L+5pPjWEE+Vxy/G3xiARIgARIgARsAkVWxPVr5qHz76F2YBBZedAp69MBpGexiMoWfKHC9/tP47uN7+CV7qCSuhrPbAT+PfYNUL06RpzP8cXHr+KV67t1ulLKz2FcKfI66ucjaXx7OINXrq92lHYvXSvhCay9fiTCHzZP3ZOX8NWRuLLAeCZt9UtPKv7Rn8HvU3F9iekio8uCgGfZlYWLE5Eyb+4YBLrrkPwk6AbSh9bkbRwa6MWhL71Fmp5iv077cvcEqq1uRzbbHoiUyaleU9J0xl4ACkj72V3a/7vTWSgpbfRWZvwLSqP8xkOtiGUdGMJnuJfK5RY3jN4u4NCAbzZt1WZ86f+Cmym/vPh6DENbK9Fp5WaQBEiABEiABGZCYEG2L6zpfNvbSWVNCp2dmzB0+TPcm4mkpcx7/m8Yj2j/14kqJ1YU2bfwxTCAyXH8iASeEWs4XsZLtpW5+lWswAh+mLQqa3nHU3596Z9j6shtrDgr1veovwLqxiV8LzKF/j7H9+frsdaVbTU2ttbj58t/x/1QXkaUOwFRZmX3kKy7C0g19rsLJtdBLNJm5xRRhi+ufw/p/gmI8p5MHsAFZfWNdguZKRtVpyy+zHpt+uoQ5daKWPXH7RjZexo3rbiCgsNXcWFrI5rwEa5OxZe41/8eLrTs8e5PUVmr38ShrX1o7fZfTPfGbgPXTmFnUjjl+BcoF9UE40iABEiABB5PAkW2iJc/1JWpI/jfkbcwueUSRH9+8rBnNV5ZMdCy5gAAIABJREFUmcDox1NK+X64sR4Q6/jvANS8gF87XR/PvOW6neioKjyfE8ttPPynZBCFvgrPSn0xfznrXluP35/9Gjfa3sINKV+zG+u767FSwmqycAkPnD651dc4lns3goGlQEB8xDNiRY5alOnroLPNnuRX8Z6PuC9bngOfi0lk3gNIGhcUk+64tUCU2xe3ebsrqYl7Gju7h/07p5hykb/DOLnXWVyK00i+249t7iTEKuAuJI+zhpu869B4cB+uNBzASct1J+x7b/J7v8Li7PqZbZ/olWaIBEiABEhgqRMosiK+Dtt2bMLRUXkVXr4Po4r0+6hIy1AQ/+80/gFHGf/dC3jyzjjG/3sIeKMdT338d9yv/Bo/b3xVKbziWjIplmfXFUX7j+ceVFV4SpTvtRX4VY6MBdVdvdt1ixGlfbQDgFHGYcuVoyEmLQ0Cxk1EuYUgsAe3LMg8gBH7zVWo1zqP2q7Qt22hfzHkzuQYerKiwIcqcNxXKnNu+ydvyWoCiuuq1B40Ja/iZke12plFWaKxLaIBHaV82cV3XOnX7eh5sS7Sx/vmB6eQODPo7fYSWyOANSm0tZxC6ydXkOhxtm/MlR9Qu8zU5snDZBIgARIggcebQJEVcUBeLdd0WZYkZYW6haYzi3RP8ZzjYQ2eqgF+DOT5YSSB58S3+uMhTH0MPJn4k5fDZx0/hgeIt4iPZ47hgViuHbeW51puY/LYJdx3lWevWhWaQd3KjeaOU37tH/BszTlMZl5FheueEqibh0uTgFLIRamuQ+vWTai5dgtDsv//wCD2RyxW9CCIO8sg9psIs0WhWaBp4uf4K4u7h877lXtTpWyh6P2JVT34oRy9QPMoZJcTz8otCy4TyWak4V+4KW443keKvJrjQsqHXSXWojEuUyD+5idAotIzQnhvC7jIM4CKhyRAAiTwWBIouiIulqTMAJBuqEPSQeztGbzYmQd3TJEdX97BK2ZBo1ith46pRY8bpStvJNQOKSvO6gWPK1N/xtSRYxjdcg6jyq1lN1b4PGABnD+GG+Y1ve0+AkAs8RBLtlNemjC7quSrO7jbCpQF3HFNwWps7M6o3WBubPHOge1248UytNQIKL9o6ZRSwiVwC1c+nUBjgV+g1MqkKJKDyIhCnkxHbv0Xye3FSs/tJCKDUnajrOlWXvF53yl7mcsHf8yfswBUtiXMhvohk4he9TXQZNdCKsDDuCLX9uuOkFP9OHtety+LYs/2vxneicX0h78kQAIkQAKPBYFl09P+TybevXsXGzZsKLvOz0Xun77/n5L0VynLI38um20Dn37uP0rCiY2GCcxkvHtWWF2Pbw9tp2ql3Hbd8hqyP+gjVu+DQJfzWffwRNqxRMvXNkNbk1ouLY67hlkY6jWWJ+Qo2V4uvyXcmxgEdjXxCnghU1dAzmD/w330qogP+fuq8gXa8c7FQk4I4iVmCgmQAAmQwMIQiHtuUxEH8NO/HwD++ciCnJWyUsSXLcPTz65YEC5sJD+BuAs6f0nmIAESIAESIAESWGgCcc/tBdm+cKE7O9P2nlhefA+dmcq02PKT0WI7I5SHBEiABEiABEig3AlQAwWw/Jmn8QjAL48eLahlXLZGVNsJLuZRtGwZRAkXRvwjARIgARIgARIgARKYPwJUxB2WWtGksjl/Q4s1kQAJkAAJkAAJkAAJ5CJA15RcdJhGAiRAAiRAAiRAAiRAAkUiQEW8SGBZLQmQAAmQAAmQAAmQAAnkIkBFPBcdppEACZAACZAACZAACZBAkQhQES8SWFZLAiRAAiRAAiRAAiRAArkIUBHPRYdpJEACJEACJEACJEACJFAkAlTEiwSW1ZIACZAACZAACZAACZBALgJUxHPRYRoJkAAJkAAJkAAJkAAJFIkAFfEigWW1JEACJEACJEACJEACJJCLwLLp6elpO8Pdu3ftQ4ZJgARIgARIgARIgARIgATmSGDDhg2hGiK/rBmVMVRykUXIBKIc5V5kGClOmRDgeC+TE0UxSYAESIAESABAnKGbrikcHiRAAiRAAiRAAiRAAiRQAgJUxEsAnU2SAAmQAAmQAAmQAAmQABVxjgESIAESIAESIAESIAESKAEBKuIlgM4mSYAESIAESIAESIAESICKOMcACZAACZAACZAACZAACZSAABXxEkBnkyRAAiRAAiRAAiRAAiRARZxjgARIgARIgARIgARIgARKQICKeAmgs0kSIAESIAESIAESIAESoCLOMUACJEACJEACJEACJEACJSAQ+WXNEshR8iYf/fATfnn0CJieLrksZSPAsmV4YvlyLH/m6bIRmYKSAAmQAAmQAAmQwGIhQIs4AKWEP3xIJXymo3J6Gr88fKj4zbQo85MACZAACZAACZDA405gHi3iE+jrOA4czKBxjYN1qh/phlMYiqK8dR8udqewKiptgeOUJXyB21xKzWl+tIov9nN6s7sOV14fxP5qv6T3+tPY2QUcGrCuXX8W35Hk78LbyKTW+eJndGDfG1pOINtRDQyfRnJvX2w1TWcs2VX5MbRl27E5WELVA/REpQHIK38uOYysqk255zVjpNWSKyiL097O0T26jxHpbpTDJGH3000sPKDPZ1Vs/6NrGsbJ5HtIFDAGVP2Xt4fu33Hx0e0VcB5iCqp2CuAZl0+ug7Pre/OPX2cc+Madkkmf96PXgJrO6HoKbiPUx+KfB5Gt9XyoYX+EPc7ta9WfK/YozMzLmneczLi9TQXfuzwp7FCE7mInm7B7XzDtybk6gAsmPe9vY+w1GTdWY6vMdf+LKxRZprB7WFyVjJ8fAvOjiNsD1JZrTQqZbMqOAaAHL1oXhxKuhMvrjvI5vthyDA9qdmN9dz1WBnoUf+iUUxmq8PzAEWxcG5+7ZCnD53Cj5wV/3yYv4R/HgP8spL95+ZWsZ2w4H4GpfnSJEt5ZhaPv9mObPTl2r+uoSpqR7ArHG8Uk78NeJuLZQf9EvLod2Wy7qlTKhyYN8iBJxijfrigT6OvpUwrSZudeE/2gjJLfeVBacrjVugq1HTOf4Qn0vauNFkN76/I+3A3nkATO+azZ2ofW7m35lX+3gmrsP1OFZMNpJGImMCqrqv8WgFvYmTzllm7q3IeRrnA8jMElVrkKngej5LhVzzIwgauXb6GpNTDrxDCunG9EWzZ6Eukbt+4Y9RRvI4womtlucxT8lTY2oXYguo1gbv9xkc+D01js+JF0ue4/saSKfI4DitWXRTKomXFjiREddJTo6MQCY9ehsdUe++HzrSqyxsO9KVN1gePVUYJNKf/vMHq7bqHpTHCs+nPZRzc/OAV09oaNEHamQPjepx9hqGU7ajvq0HotkHjNf8/JOT4CRXk4dwJzVsTdmdxAJdINH+WV6F7/e7ggA7rwMZe3zsWb4WW8dP19AKKQf7g4xRSFu20Ezw/s9k8w1tbjtxvfwmimAivTLy9O2SlVQQR8ysV5fcPVFqthnGw4BbHANlYDidE67OyAZ+kMKaQyib6KROdtXMF2JLrGUBujtG3uGES2wxHPKGG2lS2n5FpZqjXlc+YNJE59hivXNqH2oChB67A/O4j9gSxyz5qzRT9Qpz6MeYCrxANIBq2QrrLhlINMTuZioPDO5/5qbfA4GfEGBOZ8RPYBaE2G30oEx0vmhX6k3wU61cRNyz/S2YtsakKNkchx4fZXNxw+D1LPcUuqWfK0++cqGHqSVSHPH9zCBV8f/cpUnBISZ+VVz0A1CbFEl2BDHY4GotxDuRZ2jcW/MUYRzwOAoa7gBMiVTAdatgUivENff1sqMd5dh53n4629XsmZhpzxYL9ln2kVheavbsfFzjS6+ieQcWyHcedb7iurzFv/Quu38vn4WfHINQG3753Dp503GnnOIew3NjIxBQ4dTKFxTQqNbrvOtZvnrZ6bnYGiEJizIr4qlUFWRJsaK0BAM/PL+C1hBZQsbRajUJdWivlv/RvcOXYOOJyJtNRXpDP4oSONL4bfx0uPxcRp/gkvhhq1Uuy8iXLdHvSxKE8Z59xKvh55qCbH/K9QXcu4UWbSuILXsD9biZPJOrTCr8i4fTYKkWtJclPgKoP2A8ZJVpP1gLKklKM/WuVjgsrqs3U7OuVB6codlTn6IWYevrEPy5aouvxxpg4Tq+oKulIIm3d1jpvdzTj6oqOYJeuiXflMZQFl1kSbN43e+azG/oF9SDek0RflbhJbj1ejDjkPaogF9ADgjp8UMq2nkRbFpfIvuLLDuGisw/6BMaS7h5ERd6N5+JspT9Wkr396AiljrqtLXHYyliXRUfbmIKd6BrovfnVbkRORYBvyzPTJGcxgH8/veYibbKgWgxZxRwx3Qi/XbLZauXjtHAW8+4vcC4Dg+dLX+keojRiHkVZ1scCrtw3DGLl2CxdyTWhMe3NQjA1lOY8ZdTBhombwq8+PuCv5/8ITlPB4KcwlTNUr9429t3FoYNBzAfY3qI/Uvfcj1P7ReSsz/BccxXZcVJz0vd/3ptCdsNrKe1TFjCsGgTkr4jMRqhyt4ff7D2P0yG3dzZZ38ErIOmy7n8gUdGbuK+OZtzDpWsqM+8o3uNORxsPWoAKsLetPGRcXcSlpu+ScAlPWOTTuJu8AXzWcw88SHZR/+K/4DruxPrXaKRT8WY2NrfW40XMJ9wtxUQkW5/HiITA1hhEACSWRPDQOYGTrpgjLWCN6zog17jTeaenDMXdsSsE+y1pqK7K3cNQ8LI1ibSvB10753Bg0FFHeB5EJPUBlsi7+6uZB4ygglYW85o+Y6NuKjsjUU+la/P1KgKfoiHzjo7dC/r9aodbSz+f/SpGRCoevYsiV15HHtlRZyruvffXQ1a+qxW9f9Qvid59CZgBIN9RhxFWgARhFxz5HvgrNgVYiGrsHdUT1oKPAerJp62G7O5mTjGoyhD2mEu83chzY40iybsIhr8Q8hm7j7Lt9Bb3O91uLhcGbBcohXLTPsN/ibhe3FLNSnYcZWsSNAi4KtvuWy+6SClc7b5+EQR2SMrF0JmLaJWJPxLUuSvwJNCUPoKv/tbDPvrpnWbxCbRY34kKchdq9RoPtBwwS6rrMbaA0k1u9rk7YBdbZ2U0417l6g2nfNwP3NUC7uYnriltvj7zl2mfVFs1V7nERHodWOQaLQWABFfGIh2QxejTPda5MHcHKFKAUctFkAn/jmWP48XAGr8Qqs4EC1qHUOXlnN9Zf137nqo2Gcxi/vhvPbAT+PfYNUB2jJLsuJe9ra7Yo3k7ZCtPG0DmMNtRj7fX3USH5Gz7EnV2en/r4x5fw5I6M3yXFlDW/1a9ixdCH+NdkPVYuRv92Iyd/cxK4+cFHwFZAHi7Kato9aL2eDBfNqtdc7fh/OrQvaMhf2y4SehAAiHRrOaDd0mw/dLse5Yf9Hi607EHWPGiUq0kj2sRC5vplBgqZw+GruIBG9IQMsX4LkOvbLJOG7lBmtY4lysfXfftn2pvn35uf9KFmR6/7tnDbwRMYsS3aX49hCJW+VrWSpCc17iJ5O4fy79VvLpJmkmTSQ+fISXAU9KYzEQth1Tk6jqPiRhOFztQd/FVyuGZjlaof+nNc9BtsJ/a4Cm3dGWyWvvl85ycwcs1MUHVhz1rsWNKdOiMVM1cp05OTo9eiFRxdhb8+V9SFPA8wFmy39bwBbfEOZ4u+HtZBJm6e64OZWMcNFvGJb0Ry719wMxUYbzLet1aiM9z0vMaYiQbk3uG62m3S62a6/Iu+Je/Z9a+51+icBDEuJo67oFuXMWo4EWY8il94YQu5/efgXr9cr5tQ4zYgAduo4ktATbGB+5vjEYCFU8RjH5Llfx5+vvx33E/NZBGn9PlzTB25jRVnj7iK8MpUO/51OY3vh3djTaLKAWNZx383jh+RwHNrZWIwBBxu91xKqv+E52t0Wbj3PLGS74ZSzNf+Ac/WnMPDfwJQCvU3+OEO8Ks3YhR997SswVM1t61ybgIDZUNgGFe+3I7aF28h0dqLRM9x9P3R7JCiFQiz84d+0Bg3A6+DkUqIl6xesduHJux/yHn+2ipeWW3dwarcVZTrgLg2JN9Tr7ITH5zCUMsJ55WxqTX6VxRZtJzw3A5EwXEW1BlfcdWuu8BMW+903/XDS9WsLHExr8SDymy0KDOK9RhJsaCFOOxrrCYSW/fh5IunsF8YZi2GkS1ra2VzfxrJjvBuJ3YR97w4i2btNBUePo2dXfK2YA+udtQh/CrelHB84pWi+hqudjTH5I3or6vcmrpm8RuyvjeiVqoRX+CxIIcqJMzEL0dTrstFaOJprqETaLp2wHprFFWZI0dUkhVXjPPwwY6PsCvKl91qNxR0x7t/MhvK50bYyqzsjBOYWLv5rED1mzi0tTm0uPje2G3gWl/E2zSrrARdGQPxBR56rjVXnRLO5OxgO7JnTiOZrFNvx9pGm9Eq19tcdosyMol1u+c2aiALh80ERMaR3yIu4+CsU0bkNDtEueMj4P4VNbkdH61Cz8FKnHVc4XR1/vNkxKJF3JBY2N8FU8RDD8mF7WfRWjN+1KNbzmEUwIqzQXeSXE1X4anfRaevrExg9OMpYHIcDzfWA2Idl7w1L+DXAP535DZ+Pp/GjSP+8ivESc/81dTgN64VezU2dsvCUfM3hYeyr6Sd3yT5flfnt8778vNgsRGQhyFaM0h8cgojEIUzo/w7k47f8rYdm3BlbAKonojd7cFVQqI6pxQTf4Lc0EVh8/6iLDBaWTN1i9Ve/Eg3YwKdA0BXg/hLi7U3n6Ip1vJ+nD0fn9fI43+9LixOKD/3pG0Ni7DeSj9UHXKR5/mLnrREL9aUqjxFwPYVFcXHPja7Wdg7oaT0+pw88phk45sqD/GdPpcjk8P8Rst68SDQtbcPNVs3qYWwfsunKWs42ds1ap9bc55NTv3QD1jEI8bSTHmq+n3KvN8SLRwuQhbmiTuEkcb7DbqmKAXeSw6FxMdfT+aGcdIeR6GcfjmUMrWg5yGF0CZmImNoYhES3IkIuF4EswVdMVyf/HzX7zo0HtyHKw0HYC8uNuM12Ix9rBTV9YW4rdml8oTFaLjV8adeIzs5vam2KW1Vbzvy9SVP3SpZFlXLvW4PRhqM8l9IOSdPjnvdqtTbqO1oxslKb0vVzR3t6v7obyHqfqxz0CLuJ7UQRwukiMsuCLKIYz4G8UJgmUkbloKr3D/ewhcFK+NBS7OlHP/uBTx5Zxzj/z0EvNGOpz7+O+5Xfo2fN76qLOjjAJ48nMHvZ+ESo3snlm7gYd6uFmo5z1sRM5SIwDi2o7kaGLe2JFuV2oOm5Hvo25VBY2UVhno+w73KMe8BFJA1WhmyMm21/Q+ByIdo5ANfW6VPii90h1lEtw6rUKn92Tvfzr0oyRHBt0jTEkv5S1rW2Ph+9KG1w/Mf91VhHdQU8NCPUjhD+4iL0mJbqMQKv3U7mo1ldmodmge2o6shDUQscrNEmnEwztUgn0ImSo+8Gm8es/xII8/pjEXKWWBWPHPWqMdneGHeBEa+tBcbOoqzco+SnXiiK7Utlble+evSnkW8ZOfBUZg9SyyA0BuEuVuajSuFseJG03Ni16TQ1nIKrZ9cUW/s4t+0eLXIuMg3SfJyFxpytj9VLmL6TYfIIm1d3JHGTsc6Hv0NBWutjNtcI9rcsA54fuEycZvpn/b/DvmJu9UY40LMIm03Hy3iLopFEFgYRXwJu6X4zuHaCvzKF5Hr4GU81wJMWgsh7/d/qPcql/nKpC77w0gCz4my/fEQpj4Gnkz8SSVUvFGPybbTuPNfns93rtbCaYVaumVyUIWn3gnXwJjyILA5pc1+Mnnz/qpR23ILZz+dQOMfK1FzbQy9L/ahqTWwt7dTIKgMefUYi5ovxjkQRcbeacPLo6yBjmuKuxjQTdblLsgrZ/s1sLJUu5msgN4zumbH2xG+m9rlJGF/xMVSHmXrNfW6OfCK16rcDcoCTqx3DyMCuq2IhHCU9MXeh1r8YWNeww/5fEb71DaIOc9HuLV5iTEK5z17/Zm4eoiC0l3pLs6Layx6EhTtmqLrmAPPOCGC8c4iZh0tLgmbkHAVbnHp0buDDJmdeILlQ8fRCo7O5reIh4oWGDHX8yAKsiwK9rkC+94gFChInmxGzjzZ3GQ1MVFHtZaPuZscGbj5CZAILuRWE43oXVoiK7Ej1e4i+9CD40gmZW9va7/46gyyf5SPFNqufXbhwBuD4BsCJ+tMudgtuDss5bRpyo5J25HO+U0AWsRtrqUOL4girny9tm7Xvsql7vGM2tf+2d+5nwY9hhvyKtHdfSSwY4qxUpuLxLerifh6voUb8HY3qUi/D2TegnFrAWRhpeNrLkr90DF8t/EdbBSZ30ioHVJWnHV8uqt345WzskBT6jR/Ut7xCTdROX61Mv9XjKdylBn+Gx7U1GC96+KSo0ImlRUBeSBoq6B8eEuUBCBq7+68Dw7LF9sAsF1Bgl/ylDxSp2yVmEzaFkhHqRf3B7UndYGvnOXhKa+Nu8P5jRxmwZORT/9OoGLXIC5+mlYP3dxbyem3eokz4Tb8dc7yKG7Bnl2dTCA+sV1T7MR5Cr9YGTGZyV23evuRM4tWqL0FfDpzpGtKznpmkBiy8HqWaF8t9oJA2yXBZHI+kHRoYC77uzuV+ZR+00DMb1HOg/MRnvONaGqRnYw+0l+kjBEhHB1l8Q3mCluAgznm71hfk3g9UKM6p84WpoGkyEO5rvZC7xbl7qoU48YT47Yme4uLy5/vL9Zw4MsVceAYIlSKKPfOPUcWd6r1LUbBiChqotak0Onuix51z4qeMOpr0lTC34UiMH+KeOwAjXlNvVA9nFM7lttJZD159hcXZfn67siSJlKU8Yq0ObJ/A3VH1RUVZ6qQNNviZuLtX2eB57f9f0JFpIvLN7jTcwkrWt93F5TaxRkuUwLKUqO/4hjsgdl2TRRXtTgppw9rsLR+nd2DA/qBkdXfC7B9YaXeVU4xUcazHfLQqcNJtb3eME7m3CPXe1WsqnAWccatP1HtyoNLyaFdYMwrby3HOkBcQeRbCCmtpHiW3UBb0qBY6At4BkZQmXWUzU5t7Tegvzw66wpDBe2HvkyKZlm/Uma8DwGV3A3RZ+GVPhpf3PB5FaunjEkZR/43QvncAEIwIyIC7cUuPC7+eXDfQqlB3I79u8S66310yN1NyO6FbyFkwOJr55NwjAVYksyE2BRpOjObb4n4Gam6Iq5JMfzV7HjTvc+YNuN+b34i+3JnsHkNkG3VizPj8rrxioscFTI5MaWCkxT9xsWker9mK0gvRoV8Bg8/C/u+akrJBDkwNcC4tXbH3OtNfu+3GcnLRfpiqtcIQxaBZdPT/u+T3717Fxs2bLCylEdwLnL/9O8HgB9DeXR6PqRUfu1DeNbsTW7VqfY4R9Te6VYmCS5bhqefXRGI5GExCcxlvBdTrgWv25lUFLat14JLxwZJgAQWlIBMfPw7jxSveVGGAwuq4xpzJik+v/y4vIxfsgTinttUxAE8+uEn/PIw/7LFJTs6zMd/7I/2iIJ+DPhPOy4GwBNPPYXlzzwdk8roYhCIu6CL0RbrJAESIAESIAESmBuBuOf2/LmmzE2+kpYWJfIRgF8ePXo8LeNRbixr6/H7fK4ty5bhieXLqYSXdPSycRIgARIgARIggXIlQEXcOXPaokurbrkOZMpNAiRAAiRAAiRAAuVG4IlyE5jykgAJkAAJkAAJkAAJkMBSIEBFfCmcRfaBBEiABEiABEiABEig7AhQES+7U0aBSYAESIAESIAESIAElgIBKuJL4SyyDyRAAiRAAiRAAiRAAmVHgIp42Z0yCkwCJEACJEACJEACJLAUCFARXwpnkX0gARIgARIgARIgARIoOwJUxMvulFFgEiABEiABEiABEiCBpUCAivhSOIvsAwmQAAmQAAmQAAmQQNkRiPzEfdn1ggKTAAmQAAmQAAmQAAmQwCImsGHDhpB0kV/WjMoYKrnIIu7evYtylHuRYaQ4ZUKA471MThTFJAESIAESIAEA8tyO+qNrShQVxpEACZAACZAACZAACZBAkQlQES8yYFZPAiRAAiRAAiRAAiRAAlEEqIhHUWEcCZAACZAACZAACZAACRSZABXxIgNm9SRAAiRAAiRAAiRAAiQQRYCKeBQVxpEACZAACZAACZAACZBAkQlQES8yYFZPAiRAAiRAAiRAAiRAAlEEqIhHUWEcCZAACZAACZAACZAACRSZABXxIgNm9SRAAiRAAiRAAiRAAiQQRYCKeBQVxpEACZAACZAACZAACZBAkQlEflmzyG0uyuof/fATfnn0CJieXpTyLUqhli3DE8uXY/kzTy9K8SgUCZAACZAACZAACSxmArSIA1BK+MOHVMJnOlKnp/HLw4eK30yLMj8JkAAJkAAJkAAJPO4E5lERn0BfRxp9UxFIh08jmaxz/50cjshTwihlCS9h++XeNPmVxxm82V2HqGvvXn8ayWTMtRvRNcmf7p+ISJlB1FQ/0uae0O3cEAL3CfueIWGf7Kr8adyMalLVE5MGIK/8ueQwsqp25Z4XkCtCHsXXVy4ik0Q5THz9jMmaK1qfz/j+R5cdxskCx4Cqv6Mf9wIVxcUHsrmHkn8240i1UwDPuHxyHRTUrjMOwudDn3cZk3H1FNyGS8MEin8eRLbgtRU6tvna16q5ZvP8hpmZ/gF52cy4vcLvXZ4UdiiH7mJnc+8Lpj05VwWwdPPEX5NxY9Vu3hfOdf/zZbQOIssUdg+zamGwCATmxzVFBujePgCbcCgopJz8vX1oOjOI/dUAVN40EgMZNK4JZi7RcV53lM/xxZZjeFCzG+u767GyRGIWrdnhc7jR84K/b5OX8I9jwH8W0t+8/IomOSueK4GpfnR1AYc6q3D03X5s605hlanTva5NhP3bjGSXfazDNZ29yKTWqYdt6/lwuhuzdR8uZge9tiShuh3ZbLvKIg/rK6879wxTSD1IxtCWbcdmExcu/s/xAAAgAElEQVT6nUBfTx9Ejs2QB+UBXAjlkYgo+RvRI3VbcthF5WG5c9SOmc/wBPrePYUhAEN762Jk9toznL0YJ+Scz5qtfWjt3oZsh9x0C/mrxv4zVUg2nEYiF19V/y0At7AzecqtuKlzH0a6wvGQ8yxjSs5dg+6fW0gFgudhEw7Ny7NhAlcv30JTa7D/w7hyvhFt2XV+MZwjGXfuuHXHqCgrzTh6zSsiz7Nst3fsD0kbm1A7EN2GP2/wqMjnwWkudvxIulz3n1hyrUkhk01ZETqoWH3pnN9Q6hwjzLjJW42cm+N5c+XOsA6NrfbYD59vVd4aD/dcg2OB41WN/7EYMYbR23ULTWeCYzUmO4CbH5wC1D0uPk8w5d6nH2GoZTtqO+rQao1lle+a/56Tc3wEK+bxnAnMWRHXD6c9yA5UIt3wUUggdfK37kOnGWPVb+LQ1mZc+XQCjanZ3KhCTTBiLgRE4W4bwfMDu/0TjLX1+O3GtzCaqcDK9MtzaYFlS0zAp1yc1zdcPTEexsmGU0icGURjNZAYrcPODmjFSWQOKaSi2F5FovM2rmA7El1jqI1R2jZ3DCLb4XTcKGEtJwpUDLWyVGvKz4Tf1Ge4cm0Tag/KvWUd9mcHsT9QXu5ZXXhbTRgCSXM8jHmAq1oPIBmcmLjKhlMOMjmxJkIzlsY7n/ur9STkZHAyI3Wa8xFTf2tSjCr+v+B4ybzQj/S7QKeauGn5Rzp7kU1NqDESOS7c/uq6w+dB6rGVqlnytPvnKhh6klXR/x4u4BYu+ProV6bilBDXmORHo96w7FSTkEBCQx2OBqLcQ7kWdo3FTE50rqKdB5nsdQUnQK5kOtCyLRDhHapn/v9t73pDq7qy/c/W/hnpUEbHP28CwVgDJYJzp73jSK7MQDQKGbjhQRmkmKDRjzHXL34oasSk0g9+8UY/mlRUpEi/JDABjQpPjPRNr859wkghtQkp6Yu2+ihTOp2q7WPtf2fvc/a59ya5N97oCujdf9de+7f3OXuttdfeR/e3vRZTfc3YdkYpsUGxMoTUfDg4D0a7RCcudmfQMzSNrNI54sab3ivL5mBEdPCzUSqkgNvvzvxJpSwWGUNAGCTIMAKQYgocOphG64o0Wk276tntCBk9TD4H5gOBOQviy9JZ5IjT+35tb1ltvbcfdbULSQhfhzdvnvf2Y2Enfo27R08Dh7N4Y2W0JzWZLH7oyuCz/Hm8qRWpaDFOqXIEpFAsBTPonSllLSbhKavGlsoN0KKanJSWYd0vYxnXwkwGV7EB+3K1Ymu2g3bCfFZMLRAZS5ImaAmD9gKjsh94hCUhHG206scEpeK/Gd20UBq+fYX9i5hefGMXy3YfLTdN09CpgtbELlcJIWzelyVu97Whd60SzJLNwiqu60Z+Q8JskC/HNxjPBPYN70WmJYNB39jE0gkoypBaqMkK17cfwfxJI9txUrhmZGs/xtUtcidEKD/Dk8j05ZEt2RofbtONzxRPUdvpn1QgSQHp6anHQC5r7agoYc9tckYxsQYag7Fsy6uIhKnSmunwGS5gx8s7DnHKhmgxbBFXbBiFnp7ZXEIqIBNA8H5pRgdgdr9jnyFBz//8Sb7SyIrdhjzGb9zBuUIKjW5vDoKxRpnGMSsis3G7k+Nj75pIulEFJTpfPizdQ4DeG3vGcGh4pLBHgXj3XkHTRiVn5T9GLzbjosBJviucnUKjsNrCu0aGfyuNwJwF8aIMJjoxsLYZZ/Np5ZrysVx0Fohg93DoMCaOjMluth/AWxHrsHJb0UDY7isRlw8qewEvDR8Rgi/R/hKd+PV4BveUtWxJvxZ6qeyn+OXwb/BNy2k8Ifo2bYoT/d2XVMv1eF3RFQm67QPAl7p+mP/8X/EtdmJ1ermiEf5Zjjc6tuLWwCU8LMVFJVyd49WDwP1JjAOoExzRorEf440NHstYKwZOAR3JkzjQPoijjhV3EIGVzl5I76BXL5ZasLaF4BsnHDcGCQoJ7yPIRhZQ2qaFtdAoAaQkxV1v8WYDlxdb0CGeBmqNxd/dWg8EHeJvauKOZU2SHEuBWobL+b8QZIhg/jpGDb+KH9tSZQnvTvti0ZVb1cYtCLT7kEZ2GMi0NGPcKGAAyNWABB17jByCOiKFiNa+EZmQGFECbMCbtB52GmWOCgplCLs0keDXOw/seURFPe6NAYU5hMbQ//5gSdv5rrWYMHinxHYJF+kK5Vrc7eqWYPa0xmGGFnEtgJNCZHa57C6JcELtPhEGzUiSYtmVRdSjRc6dQHGLEAoSxDvLwivImZfQuTgLtXlGw2yEDBLiufQbKHVNrdxKN13C5gMgbgdAPediB9N+b4bea2T9Jjc3cl0xdAdol2uvbhaAH1d6x3k8Dq16HKwEApUXxDGN8c+Bc2pLXHSisRYPkAgWy0r0rEw0l6aPYGkaEAI5STKhv6nsUfz7cBZvxQqzoQqh6JMjGXxD9W8uV4L1aUzd3IkaUe4S7rVsxcqb51GDr3G3K4Mvh36HpdSWcSk5L63ZJHi32HXpbXsaE7o+lW+5gLvbpRJA5Kf+6xJe3JJ1XVJC/CHxeywZvYD/u7cVSz1W83BxjlcnArc/ugI0ArS4CKtp34i1PRnlOSe2uTrxn13ycFXEX9uuElkI4txa9uNc7CImCQprePsu5PRCI1xNWrGbBEfjl2k3boXz13GOFpiIku9agIxvMykNfZHCJKF6fXzN7p/VZDmDt68NIrXlrHkvbjp4DOO2RfurSYyi1mlSCklSqfGeuRH+vXLnIqmVJE0h4nqkMpSAvuOU3xf/wdAH6CU3Gh90mnb41+NnLBf9SrgIhRuneD1292Wxnvrm+M5PY/yGVlBlvcBarCzpipxXMDPzWQqYvTf8Ao4k4dJTZD0uYCqnEuMAbcE2rRcNSIt3tJj/eVgFUtwC14dwPYn3KP6GB+kiblg03xtr0R0mUea4VjRc4bRBnpvpgbM7SGX7V28wz+icWNEuJrZsRAS1UUMR1/OR/MJJCBdn7Qo27I6BfF4bkHLq2EYVJwOpSgPuNscxABUXxMW2q/1yUlpdz9CGCvhoPp0xfXL573iYnuUhzvYD+K0W4knoxQX8cA+AEHrJyq2F8uX41ZZ6fDtO0shyPPzvUeBwZ+BSkvgzXk9l8M/8TsAskFb9lb/Da6nTePS/mvbX+OEu8Mqf4qzhGssVeCk1ZtXT6fy7cBDI4+rnm9G09g7qOs6ibuADDG7UfpdSgBhXlle50Gg3g6CHXiEkyBZb7HZUh91FLvDXFunCamsmq/BdFq4D5NqQ/BBNw1nUfXQCo+3H1Jaxpur/JUEW7ccCtwMSNNWBOu0rLto1B8yo782QfZeLl6AsLHExW+JhYdbPyoxSA4yoWthCHF2YhSLRuBfH157APsIwZ2HobVlaK9vodpyuzWZHwFfUjIs6NBspkz8J8odOde/C9a5m5wCjW1b5xAtBdQOuhw47BmU9/TXCbVBqxqGI9b0VTUSEfIEnwzjUo04rfgUaMi4yEcVTP0PHsOPGfmvXyEdM8eHLstIqMQ4fbbmC7dq322qrYNDMd1eZja9TSBGRuz7nGluxA1dw/T75K8dTejA5BtwY9OymheoYHkPpJUYD15rrqoZSzg52IndK3vhGwvDuiTZ00PNWjrNtJAcNjCEFOjisFV6aR65FnOZBv+KK+NSH1M38CLl/+ZTbqYl6DBysRb9yhZPk/OPEFvESJ02Zi1VYECfLEvmM6Ykmt0W7u69g2+USNOIyd7YS5LQf9cTbp0EXKgSuJbNtrYjQe3cKD7EO/xofw5MzGdw64razhJz09F8qhV8ZK/ZyvNFn+7nfxyO6osEur+s5v8vx6hvAd5NfA4liQrtTkSNVggBZmdGRRd21ExgHCZxZ4d+ZVH7Lm7Y04OrkNJCY9lqCqRtGCPH1SQgmbga90N0DbD4LjBTWNG2y2pPwvR7T6B4GelrIX5qsvcUETelz3n8mvqzmx91eJyyOySvI7K1aj/WWeidolHBril9p8R/WJLqBIGD7ipLgY8eVK8k1+yaUtDyf40IfG9O+qbSIb3NcjsJV/LxePAj07BlEqrFBHISNs3xKnGyfeOlzq8dZt0blIodmPXNppngK+o4w71qiCYeLoIN5ZAzS3AS/YdcUIcAH2ZEQGZukMpfHcXseRUq6fAhhal7HIe1xFVHzynLZirBtEkKuFyZdBYq6YuRxfI+6QQ0nkQzf0hSip+drKNmJCkF1dZnPm9HOWqPyp15BNzm9I27N6RAGxRLeRQ6HvggdqqZ33S6Mt2jh31cuJu3+EOLedcvS76Gpqw3HawPL+fquTmHkcKn53seyBFvEXaTmI1ZhQXw+uvC027AEXOH+8S4+M37es+GtHi/9R4F6b9QIV5IpAC8ezgbW9AJV/Flk6QYe+TOt1FIt51YVDlYVAlPYjLYEMGVdSbYsvQs7kh9icHsWrbX1GB34Gx7UTgYLUKgHfmHIKtRo+x8C3kU0Ykmk+tIqfZws8l36EN0qLEOt9Gfvfq+g1Uxz4BzS1IniV1or9SGq+H4MoqMr8B93SFiRVAmLvk/g3FbgsKYgT1b4xs1o0xbC+6vQNrwZPS0ZwHfY0uJppsE4VwPhM15AICOhh7bG2yYtP1LvmM6Uo8LlZ4VnYZJifkYP5kk3yqA9JTibm3j8RG1LJRAv4MjagUX8qY2DEpgDSyyAyA4CxO5S6ddf+rGxU8kf+hxZr4UsK8+ORXfG3efVrh8O0zgVU5LCdYrH1fWnwkUs4IXaurglg23J5sjZkYCmdVbGJLZitwnLQOAXTorbTP+k/3fET9yQ0caFmEPaphxbxA0UVRCosCCeQFt3A7btOWldcyYPVKW63yuPn1UVgGhYWFmDV0xEBUa/wr9EkHy8j+J71OP1cBkVJ39zcVe5sWJbBe9dwpdHxrCkX14lWPOnrbi3+yTu/iHw+bZKlxAs1dJNlvN6vHSgBJJcpCoRWJ+WZj9S3oK/BJra76CfrhHdWIvUjUmcXTuIHR2hu71VhUA4CSiYkMeKKfNIkLFv2jA15D3jyjXFHAY02bKeWLTtbWBhqTaFrIC8Mzq1xfdOkS4ndcK3U7ncWMIjXb0mtptDW7wWcROkA5xYbaKegGzLkxFNor4otxmRSf6wMdvwo47P6KC4BrHgeERbK0uKFjgf2OfPyNWDBJS+WvdWGE+LfiXI75oiq88BT0/73iR1iFnmkUtCA+oO6pLk0iNvBxltVDfx6KzYX7+AI4u7FvFYEkUy5joO5GtMh4IdV2BnB6EIAzPOVgItnSuwzmSs7zqGumQbMrBd4eSYx/uYu43fvgZEbmATiobcXSvk+uJSUjFxu8heDOADJJN0t7d1X3wii9xGug/fdu2zqYR2DGJ2CPT42TVLDZsblgoa5unGpM3IFPwmQLzCyBbxUkejfOUqLIhLyxhtA5Imqf/04QMdr95feUDyW3LhEH9HcYu2Es3tI6EbU7SVWj8kiZ1Y2f4u7r19CeT2vaT/gDj4qKmJ3zOKJkXCt6JgDN+2vItbqoLj9pLYibf66YBmkA/QwU7tU+604o1IYf6vmEoXqJP/FN+nUljtUw68VDlxoSBAC4K0CtIHO0hIAHx3dxddOCxfbN132xXEd7iIaNJViclkyO2FhGRyfxB3Upe45UyLJ20b90XLaz7875xp1GwfwcVP6Muid4pcJSfd7OpORdvQfZ7Tb9zBSZsoYeO4ptiZZQqvrZ2xgUTsfhRs3i9ceV1TCtKZQWbEwhtYoh0q9oFA2yVBF9IfvBoucrBQly/06wj9hQoCqMg4yIPXHWdasaOdbjK6Iq8dLcJKkO2z+Aa5MhSyABd8nknROSvcPpI9hRSYcBs6Lp9J/FHH1a8Y01IVJ+WaswfytiizIxTjxhPjtkbXdpLLn/MXazhwSnkiyhAhcki4V+8cOtwpzrdoAcNTVSetSKPb3Ivue2f58ZbPpCbCv/OFQPkE8dgJGrNNPV89nFM7ltuJl07x+8VrMudRk7Eq3ww5dRuh3ipjgqErCU26CpAwfnNnOFXGKc+2uPlKqQOe3wz9GTX6wKhT7mvcHbiEJR3nC9+s4tThSNUjICw1vq8cwnzoxBxOKujD6ulp+zEMYL9cMHLyGkHbF5bo6i93kjCe66JFpxnHxW0A5ENa6I7cYKtYtKwOcUYOaSq2RLu0cAk+qG5wuFDysQogVxD6FkJaCimBZTfUFtE02+qeflcoycZOXO03LL88Wr7m7EVfnueZFW0lcOm6M/lKoK5T1l/Hwkt91L640XElqyfNSZpH7o5QMTeAUjgOtRd78Ljy4yDmkjnc24l928m6G3x0yNwmZHfLOQgZsvja5SgcsgDLuUsCX3DIMFxFCrAjaKX5Q8Y6p71waRcjket5JumQZ2rLO+Y9E6YSjt++Ru+cLNavAHIdio9woXBc8EmJpSgnunJISYHccdG5wa88XB3+EBkdNNaHz+lmJ/urwfZ7VdMhBTmkGmDKOrsTf8VmG5KXK/TFVM0c/zoILPr5Z/f75F988QXWrFnjFFoIkbnw/eN33wMuDPPSZXkl4l88d5NT8+6d4xVjSPi1j+I1+w5y1dhU9l3cg+/u9BA3ixbh5deWhBI5WkkE5jLfK8nXvNNWSkVp13rNO3fcICPACMwrAqT4uDePVK55EoZDB6rjGlNKiuOXH1eW059ZBOLW7fJZxBcwdC8sXoyfHhU/triAuxjP+sqt+G3/V7h1NPTRnnuX8M3dnVjdV/zz9oQf/zECTwWBAjtxT4UfbpQRYASeIgIeF5GKcUOW67DNOaaxWbupxNDj5GcKAbaIq+F8/MOP+Onx46diGV+wM2rRIpAQvvjVlxdsFxYq43Ga9ULtD/PNCDACjAAjwAg8ywjErdtsylSjLoVJFiif5YeA+8YIMAKMACPACDACjEA1IfBCNTHDvDACjAAjwAgwAowAI8AIMALPCwIsiD8vI839ZAQYAUaAEWAEGAFGgBGoKgRYEK+q4WBmGAFGgBFgBBgBRoARYASeFwRYEH9eRpr7yQgwAowAI8AIMAKMACNQVQiwIF5Vw8HMMAKMACPACDACjAAjwAg8LwiwIP68jDT3kxFgBBgBRoARYAQYAUagqhBgQbyqhoOZYQQYAUaAEWAEGAFGgBF4XhBgQfx5GWnuJyPACDACjAAjwAgwAoxAVSHg/bJmVXHIzDACjAAjwAgwAowAI8AIMAILHIE1a9ZEeuD9sqavYKRmlSXEfTq0ythkdhiBsiDA870sMDIRRoARYAQYAUZgXhCgddv3x64pPlQ4jRFgBBgBRoARYAQYAUaAEagwAiyIVxhgJs8IMAKMACPACDACjAAjwAj4EGBB3IcKpzECjAAjwAgwAowAI8AIMAIVRoAF8QoDzOQZAUaAEWAEGAFGgBFgBBgBHwIsiPtQ4TRGgBFgBBgBRoARYAQYAUagwgiwIF5hgJk8I8AIMAKMACPACDACjAAj4EOABXEfKpzGCDACjAAjwAgwAowAI8AIVBgBFsQrDDCTZwQYAUaAEWAEGAFGgBFgBHwIsCDuQ4XTGAFGgBFgBBgBRoARYAQYgQoj4P2yZoXbrEryj3/4ET89fgz8/HNV8vdMMrVoEV5YvBiLX335mewed4oRYAQYAUaAEWAEGIFCCLBFHIAQwh89YiG80EypRN7PP+OnR48E/pUgzzQZAUaAEWAEGAFGgBGoZgTKKIhPY7Arg8H70e4+GMogmWxW//xlorXmL0VYwuevOW4phADjHwKkQtHbfc04no8Sl89n6c8llc8MTUcJzSTl/hAy+p3Qp5jKn7TeE/p9Efw6vIv6J3Hb16agE5MHoCj/hfjQvIp26Z3nx9RmS+Dr1LNzrbDCxOmnlV1qUI5nfP/9dPI4nixtDgj6XUN4ECIUlx4qZqJUfjbzSLRTAp5x5eg5KKldNQ+i4yHHnda0ODolt2HQ0IHKjwPxFqzHMWEbX/tZ1c9skV+DGdV15kq8nKARgF2HxkDxEry/CKNS53fpeJr2Sw6U0BeiZd4n+vkinmJw96bH9zVujsd2QYxlPD1vPW+d0t59XnqcGEGgPK4pNNH2DAJowKFwE/mT2NZTj4FcFuvVIrit5STqcp0iHi7+VOJF3VH+gc/ePorvUzuxum8rlj4VJivRaDn6RTQu4KXhI3hjpeaR0j7FL2/uRI1OKvRbFP9ClTlvTgjcH0JPD3Coux697w9hU18ayzRB81zrBPu3DckeOy7Dqe6zyKZXgRbNjjPRfJPSuBcXcyNBW5SR6EQu1ymKUP2rfxzBvoSpAbFAJyexu+C7YxqDA4MgPtaDFrz9OGeRCII+/lsxQLQtPoLyUoDfNmGnlDM8jcH3T2AUwOie5hieg/Y0zkGKCqnxTDUOoqNvE3JdNoCR0lZCAvtO1SNZ7N0s6N8BcAfbkidM/R3dezHeE00HjTPNKVrMW2T/TCURCI9DAw4NZ9G6wi0189g0rl++gx0d4f7ncfVMK3bnVnlJOvPWzFESOtrQeyOosuPUCHJ9QdwNURsNaBr2t+GWDccqPA6qudj5Q/n03F+z+FqRRjaXthJkUGD1uRrfSK5KWJFG95YMtnVBzoO4cnY6tdchBfDcH2WG8z64P4nx9k0lyg8l4mm3X3J4FVo77GcmOk8EKWsePTCGyhLnuXhuJmM4yuNszx3sOBWe4zHFAdz+6AQg3o3xZcI5Dz65gtH2zWjqakaH9QyIcjfcd1XBeRUmzHGDwJwFcdLItk3sQm64FpmWK4awDNiLokxZln4Phy634WqeFrxQcY4uMAS+xt2uo/j34SzeNEI4dWEdVhy+gImuS/jFM6W4LLDhUew6wsUZ+eIkQWJfIo/jLSdQd2oErQmgbqLZXTAjAikJttdR1z2Gq9iMup5JNMUIxeu7RpDrUgxoIaz9WImCoRSWmnT9mcB+/2+4eqMBTQdJCFqFfbkR7AvVp3dWD94TCkMoa47RmIVYUN2PZFgx0UIqVD2QcmIpQjPmJhhPMbbJ/TgeVmaIph6PGPodSTKquH/h+ZL9zRAy7wPdQnGT/I93n0UuPS3miHdemP5K2tFxIDofWA3PEk+7f0ZQkEpWzdCHOIc7OOf00RWK4oQJiYHFngqKNVAoIaG8lmb0hpJMlJ6F7ZMxyoksVbFxIGWvJ6wAGc5koH1TKCGIOv1tr8VUXzO2nVFKbFDMhJals7iIDM7m09iXmMb4DaDO5EYDAf1B9cwMooOKnWkGTo2gbfIKRs/ccZ8nmlsHgR6vsifbiMczykPJKYlOXOzOoGdoGlmlq8TNE3ofLZuDghngEuKukOJuv3PzJ5VxpMjYA8KQQQYVgBRa4NDBNFpXpNFqmlbPfEfIWGLyOTATBOYsiNNDlqMW7/u0NvXQddiWgVWoWwv0XstjX2KhSOLr8ObN8zPBdYGUnVu/Hg6dxLfYidXp5ZH+Lk0fwb/G38WXQ7/DUk9+pAInVAwBKRRL6zAtZNLKLOMkPGXVY0jlBmhRTU5Ky7DmyFjGtTCTwVVswL5crdhi7aCdMJ8VUwtExiKkCVrCoL1QqOwHHmFJCEcbrfoxQWG9adyMblrwDN++wv7FSC+isYteu4+Wm6Zp6FRBi4wVtnWasHlflrjd14betUowSzYLq7iuG/kNCbNBfng8E9g3vBeZlgwGfWMTSyegKENqwSVrWt9+IQjJ+SOtluSaka39GFe3yJ0QofwMTyLTl0fW7m+Y7AziM8VTkHb6JxVIUkB6rN3ZoH+28D8DxlRRsQYag7Fsy6uIhEnTmunwGS5gx8s7DnHKhmgxbBFXbBiFnp7ZXEK4eNEOUfB+aRYCc3i8qDphFFaI7d7ZYYOnfn6dd0Qex/cAh4ZH5K6Jeo6EQnh/aFZ42m3PJkz8ZkXF2bjrxSmbUcXG4CLaonn2Iep8z7avE4TTnrEAN18ZShPv7Cto2qhktvzH6MVmXBQKhHzHODuMRtG1hfc44pweh8CcBfE4wjJ9FeoagauT00DCFsYL16qm3IdDhzFxZEyy1H4Ab2XWhdhT7h061XZfyZ/Grf/6PVbXXTA0XjycxW+VYCpoj/8loHnvEv6n5Sv8+uZO/GLoML5ECq8cOY3vsRUr+4F7uy8BNg9En9LEXz1et91DKG/gN1h9APiy5TSeUBmrbvF+AU4ZAEv6z+NNozv9A/ePAK8Px7vq1GzfiW9a/oqpdIkuKqon/FMBBGg7F9oSRS///RhvbPBYxloxcAroSJ7EgfZBHHWsuIMIrEq2IHsHvdr6pxdNvYhSV26ccNwYZO9IeB9BNmIhou1Wa6FV1uLx2lLeH3qrNhu4vNiCDvE0UGu2yN2t9UDQIf6mJu5YViHJsRSoZbic/wtBhgjmr2PU8Kv4sS1OlvDutC8WT7nlbNyCQLsPaWSHgUxLM8aNAgaAtv7JrcIeI4egjkhhoLVvRCYkRpQ7QMCbtAJ2GmWOCgplCLs0keDXOw/seURFPe6NAYU5hMbQ//5gSdvyrrWYMHinxHblc0WCimtxt6tbAtbTGocZWsS1AE4Cttnlsrskwgm1+0QYNCOpFcs4C7V+Xzh0AoVettmAQ92t6O2h3SSZt+mT6xhv1O8xAF9NYnTtJvm8zxZPh4e5R87FWajNsx1uI+i3yBHPs8+wGdTTSrF04SLMPwAOxrh0qfeD2Pm037eh9yFZv8k9jlxXDN0B2h3bGzQMa/5aqfRu9HgqWiU4WAiBigvim7Y0oLfnY9xOK59wvT1SgmWpEOPzlUeW3aVpJZSSJBP6m8pK14y34qy+Z45iggTgm+sAITiXLpg+OTKKl4azeP1oBvcGdmL18E582fIppjLrUENC++5xvD58XvpmE+2W05iy/bJHT2OiZStW3jwvy7dcwN3t0pe7WL+kEF6HlTeP+P2885/i+1QKqx2XlBA4K3+H11Kn8c/8TsAI8KEyHJ0XBG5/dAVoBGiREFbwvhFrmzHKQk5sc3XiP4TkNhEAAA52SURBVLvIEurx17arRF7orr+3LKqsKbGLkSwlrOHtu5DTC4ZwNWnFbhIcjX+l3bgVzl/HOVooInPNteQY32ZSGvoihUlC9fr4CouU1Vy5g7evDSK15axRIjYdPIZx26JNQgdqnWaNwKIthE6uErrVzkVSK0m6TMT1SGUoAX3HKf85ngdDH6CX3Gh80Gna4V8SkkJ+xnLxroSLULhxitdjd18W66lvju981FUisBbTvLluiHkFLDOfpXLSe8MvqEgiLj1DeD7HAdqCbVovGpAW72gx//OwCqS4SReGRGTM6dnyW3JlOrUi5jQpkrmEUBZ7ad4KNx5y9SFDQT36P5lGK51FoWdmdUhRmiWe0R4WTpHPHpWxx5yUh3r09sDZVaSy/as3mGe7MOUiuVqGUm6GpnRIudHzmPzCSQh3ztuYSnbAHjs6E0PPeQNSdhHYxhgnA6luN86x0hGosCAut6QGJpoDS1rjXgx0N6CjYoeeSu98uUo+ufx3PEzHWIbJQq6t6InfYwku4Id7AAoJsJqx9r8IIfsuWaM7iP4lfKnyHv73KHC4MzggmfgzXk9lQkIvWcmVNVoJxY/+t5S2ydo9hiX9MUI4gIeT48Abvy9ycHU5Xn0D+G7yayARdV/R3eTfSiOQx9XPN6Np7R3UdZxF3cAHGNyorSdSgBhXlle5YGg3g4AvrxASZIstYTuqw+5iFfhri3RhtbWkOe06QK4NyQ/RNJxF3UcnMNp+TG39aqr+X1qU0X4sOMRFC7I6UKd9xUW75oCZtN7JvstFSFAWuwd3cC60sIm8sDDrZ2VGqQFGVC1sIQYQ4kMoEo17cXztCezTAkvBFqW1so1ur+rabHYEfFXMuKhDs5Ey4vA97RbswvWuZucAo1tW+cQLQXUDrocOOwZlPf01wm1QasahiPW9FU1EhHx6J8M41KNOK34FGjIuFxHFUz9Dx7Djxv5grfPSUnx484LESozDR1uuYLvPlz1oNhoy850E5biDz3Y1Wyi102VYKNqN2tXByhfPXD2aVihFQV/sYFy6LKGeXFAG/oYH6VqvwmxRNcGieJqSpQcClxytrCml7mAncqfkDVAkDO+eaEMHPafC57p0+t6SZN0eGEMKdOBYK8o0/1yLOPW3XxEgPumiDPozOITcxnxK8dREPQYO1qJfudBJCv7xZYu4RGe2/1dcECfGwhr17b4TSK0uZat5tt2av3o1mSx+6Mpg4u3TIN3Cdd+oHB//Gh/DkzMZ3DritrFEnGpRaakUfmUE/uV4o69EP/d7U/g36vHaf7i07Ri1X8rfL+rq8WScTJksiJeCVyXK0OKHjizqrp3AOEjgzAr/zqRa5GjXSrqPTccubEYI8TEoBBM3g17M25xF32dJkcKapk1WexK+12Ma3cN08Ir8pWnb1hLW3WaC2P0h9Ivta39ZzY+7vU5YHJNXidlWLY/1lhoSNEowIPiVFv9hTaIbLOi2z6fHckg4X7NvQknL8zkBCgVD2seUFuNtjstRuJqfV3EYbs8gUo0N4iBsYPl060ucbJ946Turx1mXpnKRQ7OeuTRTPAV9R5gnLLWwJI1DdHiwZ2iDOWCneaLfsGuKEODtAqEw+fhLZS6P4/Y8CpWT1uCADyEUzes4pBHalJAcRhSLCOMqIeRCES5W1KUicB0DKYWX/Uqhi4s1F/WYrtiAJrShp6sBo5ZQ79YLM0dxi5bO1jR1fC6/tCOn+VlBN0C9I27b6RC7JP730syao8PY9I7chfGWYB6VTKPAO5Iu0WjqasPx2sByvr6rU/iMu/R973FZgi3iLlIzic2LIO4y5N/2dcsspJgl4Aof73fxmeNLXbm+2P7mZW1lZQ1eKUKQBGzhdFykHAnsL5ZibipCh7Nnj8AUNqMtAUxZV5ItS+/CjuSHGNyeRWttPUbJwlQ7GSwkoeb8wpBVqNH2I5TCTmTR9y740ip9nCzyXfKKU3G7AGrlzQrd75V0lZ1zSNNiS/g9WtbY+H4MoqMr8B93SFiRUgwIPoFT3CxlW6FIaLEtTWQRbNyMNm2Zvb8KbcOb0dOSAUo9kGXxWSgYNoyYst7xMbnCmkZb3G2Tlj9okTpB7dmHZoVnkeZIKYkesJvG+OdA0J4S4M1NPH6itsURBbbuZe3AIv7UxkEJzIFFNeYch7GG+/s901Tyaz5HNEkmTWSR20jfEsgI5buV3K4aa0HeDcu6zuLQ51q5ka2QkB24dtC1ga3oFYcPg1uGZovnTPvhL69uiBOuZXKHhK67pLl0ka5vTDZHzpwEdKwzNiaxFbtNWAYCv3BS+Gb6J/2/I37ihow2SsQc7jbl2CJuoChjoOKC+IOhk7i+sTNw/qdDYt1nsU8vOGXszFMnVYIAG+Hx7hQeYh2W4h/4TByq3Bop4kuo+dNW3Nt9Enf/YN/f7Ss5m7R1+GX7GO4dvYSHMdcPLq2tw8RlzXtcG1/jh7vAK39ia3gcQvORvj4tr3SYchpLoKn9jvS13FiL1I1JnF07iB0dobu9VZ1AOHGIyIgQxjzp6h7v4KaWoIywXinXFHMY0GSrbXBatO3tXGGpNoWsgLwzOrXlPY8PpnQ5qRMLuXK5sYRHunpNbBvbQrJF2Q7SAU6stlPCYdlWONUb1wfLdCYJIjcGPYdagVHHNUVe6VZwPDTNMv9qgfOBfY6MXD1I0OirdW+F8bTtV4L8rimy+hzw9LTvTVKHmGUeuRY0oO6gLkkuPfJ2ELK8ipt4dFbsr19QkcVdy3wsiSIZcx0H8hmmQ8GOS285LcMe/sXzLlzCLMuwtfP04JMxQB+6vD+NuoNngfebkdT3VjvvAro5RV6x2ftRHq0lPLselqJJQkGRu3Izvsde3C6yFwP4AMkk3e1t3TOvlY4W2yXQbj600xCzs6DH3a5ZatjczGTBH61LNy1tRqbgtwRKs4gHuxOFnocoB89rSsUF8WXpdwA6Ra0eKJqg+rq06ged7snO4Fv6yob4O4pbtJVobh8J3ZgCQFipC052TQtYmu7E/13Wbi31eL1/J17c/VVQoFAosRNv9dMBzXdxy5Sjg5ml3FBSrF9ATeY8kH3XuNxQE47bDfm7jx7F/fxWLI3r772/47vRrfh17IcvDOMceAoI0ItdWgXpIB0JCYDv7u6iC4Dli627YbuC+A4JEU26KjGZtC2QwU0e5FvpCOGasO+XFkHa/u2LurtpPvTBJbf6NGq2j+DiJ/Tl3ztFrj6jnTyg7lS0DZfmLGNxB8xscqRAOK4pdmaZwmtrPcpMYdr+Q3t2HSlQB3cQyzyva4pdbS7hOB/xME3LEku31hjXAl1OfSDp0HBgedVZM/51hP4itSsyDspH+EwrdrTTTUZX5LWjRVgJsn2W2yBXhsKWXKVUFxT0pSKNtYrWioT4GNdVLTO0t+Lcmf3IrD4rrsqkjwfK9wOE60eyq8hHhYhsKXiKuVCqwqXfVZC3TJnbmGLcfyylw0WMng35FjbpsQYHUyImoLAWuSTcq3cVHe4MK0ExFOhGpW5zL7rvXecXrOWzrIgKFxhZDmQAGXqnAt9siOvAwkwvnyBecKLpU9QLDSTL7cTLepF7uElYdoRQKm87dXvo31QN0W0tKhj4dm/Fb3U+5RH9mzu9nIk8p227mKddO1uFSRivyXgyRBJ9tKceEwPxVvOpj04Dh7P+W1fiyHJ65REQFhffVw6Da9fMIaOCPqweVtuPYQD75Ys/J68RDKwj8q5Z/eVOEsZzXbR4NOO4/sBQwbtugy1f0bI6xBk5pKnYMlY4wYd0gdFfR6T+LcMqgHbm6FsIaSmkBJbdUFtEU2+re7pdqSQbO3G137D88mj52rMXb1KKZkmflARlpSTeZvK1v/L1xaLkCH7UR+1TGx1XMg7RnKR55O4IFdvOt9qLDYbaiz14XPlxEHPJHO7txL7t9LXT4KND5jYhuy80543FOWS5tctROGzJVXNCWIdDxhqtIAckSJGWheScp7ZGzO1J+7o65bkW+w5xuq+kbwSb6DxK5MudM8fzweQYUlveKVkRvX2N7uXOYv0KIEdfAk02B92JCwk8KbMUpUYTCSs3cqdG5wa/+grJIEWEHEOJi4t8D7rlA7etIH3KOvMTfzVnG5KXpVK0u11f0EECuU+gD2hzCFj088/u98W/+OILrFmzZsFhMxe+f/zue8CFYcH1/+kwLC3r320J7kbXfIjrDy+nsDrGtUWXE7+LFuHl15Y4SRwpjMBc5nthygssVykVpV3PtcD6xuwyAozAPCFACpN780jlGiZh2D6YXaAlpdw4/vwFinNWdSMQt26zIA7g8Q8/4qdHj6p7BKuWO3LPuYCX7I8Jkb/725/ilyW5yQAvvPQSFr/6ctX2sBoZi3ugq5FX5okRYAQYAUaAEXjeEYhbt8vnmrKAESYh8DGAnx4/Zsv4jMcx7G5DBCgt/AVSD+FFi/DC4sUshHug4SRGgBFgBBgBRoARePYRYEFcjbG0yLJV9tmf8txDRoARYAQYAUaAEWAEqgOBF6qDDeaCEWAEGAFGgBFgBBgBRoAReL4QYEH8+Rpv7i0jwAgwAowAI8AIMAKMQJUgwIJ4lQwEs8EIMAKMACPACDACjAAj8HwhwIL48zXe3FtGgBFgBBgBRoARYAQYgSpBgAXxKhkIZoMRYAQYAUaAEWAEGAFG4PlCgAXx52u8ubeMACPACDACjAAjwAgwAlWCAAviVTIQzAYjwAgwAowAI8AIMAKMwPOFAAviz9d4c28ZAUaAEWAEGAFGgBFgBKoEAe8n7quEN2aDEWAEGAFGgBFgBBgBRoAReCYQWLNmTaQfEUE8UoITGAFGgBFgBBgBRoARYAQYAUag7Aiwa0rZIWWCjAAjwAgwAowAI8AIMAKMQHEEWBAvjhGXYAQYAUaAEWAEGAFGgBFgBMqOAAviZYeUCTICjAAjwAgwAowAI8AIMALFEfh/yZlUZd/KTJsAAAAASUVORK5CYII="
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0             Tom\n",
       "1    William Rick\n",
       "2            John\n",
       "3         Alber@t\n",
       "4             NaN\n",
       "5            1234\n",
       "6      SteveMinsu\n",
       "dtype: object"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 生成样例数据\n",
    "s = pd.Series(['Tom','William Rick','John','Alber@t',np.nan,'1234','SteveMinsu'])\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0             tom\n",
       "1    william rick\n",
       "2            john\n",
       "3         alber@t\n",
       "4             NaN\n",
       "5            1234\n",
       "6      steveminsu\n",
       "dtype: object"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# lower()函数示例\n",
    "s.str.lower()  # 字符串转换成小写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0             TOM\n",
       "1    WILLIAM RICK\n",
       "2            JOHN\n",
       "3         ALBER@T\n",
       "4             NaN\n",
       "5            1234\n",
       "6      STEVEMINSU\n",
       "dtype: object"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# upper()函数示例\n",
    "s.str.upper() # 字符串转换成大写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     3.0\n",
       "1    12.0\n",
       "2     4.0\n",
       "3     7.0\n",
       "4     NaN\n",
       "5     4.0\n",
       "6    10.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# len()函数示例\n",
    "s.str.len() # 返回字符串的长度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0             Tom\n",
       "1    William Rick\n",
       "2            John\n",
       "3         Alber@t\n",
       "4             NaN\n",
       "5            1234\n",
       "6      SteveMinsu\n",
       "dtype: object"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# strip()函数示例\n",
    "s.str.strip()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0             Tom\n",
       "1    William Rick\n",
       "2            John\n",
       "3         Alber@t\n",
       "4             NaN\n",
       "5            1234\n",
       "6      SteveMinsu\n",
       "dtype: object"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.str.strip(' ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Tom<=>William Rick<=>John<=>Alber@t<=>1234<=>SteveMinsu'"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# cat(sep=pattern)函数示例\n",
    "s.str.cat(sep='<=>')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>1234</th>\n",
       "      <th>Alber@t</th>\n",
       "      <th>John</th>\n",
       "      <th>SteveMinsu</th>\n",
       "      <th>Tom</th>\n",
       "      <th>William Rick</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   1234  Alber@t  John  SteveMinsu  Tom  William Rick\n",
       "0     0        0     0           0    1             0\n",
       "1     0        0     0           0    0             1\n",
       "2     0        0     1           0    0             0\n",
       "3     0        1     0           0    0             0\n",
       "4     0        0     0           0    0             0\n",
       "5     1        0     0           0    0             0\n",
       "6     0        0     0           1    0             0"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get_dummies()函数示例\n",
    "s.str.get_dummies()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1     True\n",
       "2    False\n",
       "3    False\n",
       "4      NaN\n",
       "5    False\n",
       "6    False\n",
       "dtype: object"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# contains()函数示例\n",
    "s.str.contains(' ')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Pandas缺失数据\n",
    "数据丢失(缺失)在现实生活中总是一个问题。 机器学习和数据挖掘等领域由于数据缺失导致的数据质量差，在模型预测的准确性上面临着严重的问题。 在这些领域，缺失值处理是使模型更加准确和有效的重点。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.1 查找缺失值\n",
    "对于数值数据，pandas使用浮点值NaN（Not a Number）表示缺失数据。我们称其为哨兵值，可以方便的检测出来："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "1  6.0  NaN  7\n",
       "2  NaN  3.0  9\n",
       "3  4.0  9.0  8\n",
       "4  NaN  5.0  4"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame({'A':[1,6,np.nan,4,np.nan],'B':[2,np.nan,3,9,5],'C':[5,7,9,8,4]})\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       A      B      C\n",
       "0  False  False  False\n",
       "1  False   True  False\n",
       "2   True  False  False\n",
       "3  False  False  False\n",
       "4   True  False  False"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过isnull()和notnull()函数检查缺失值\n",
    "data.isnull()  # True表示NaN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       A      B     C\n",
       "0   True   True  True\n",
       "1   True  False  True\n",
       "2  False   True  True\n",
       "3   True   True  True\n",
       "4  False   True  True"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.notnull()  # False表示NaN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    2\n",
       "B    1\n",
       "C    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 统计每一列有多少个缺失值\n",
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0\n",
       "1    1\n",
       "2    1\n",
       "3    0\n",
       "4    1\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 统计每一行有多少个缺失值\n",
    "data.isnull().sum(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int64Index([1, 2, 4], dtype='int64')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查找出具有缺失值的行index\n",
    "data.index[data.isnull().sum(axis=1)>0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.2 删除缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "3  4.0  9.0  8"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# dropna()函数\n",
    "# dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)\n",
    "# axis: 默认为0，删除包含缺失值的行；当为1时，删除包含缺失值得列\n",
    "# how: 默认为‘any’，只要有缺失值出现，就删除；‘all’，所有的值都缺失，才删除\n",
    "# thresh: axis中至少有thresh个非缺失值，否则删除\n",
    "# subset: 在哪些列中查看是否有缺失值\n",
    "# inplace: 是否在原数据上操作。如果为真，返回None否则返回新的copy\n",
    "\n",
    "data.dropna()  # 删除存空值的行,how默认为any"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   C\n",
       "0  5\n",
       "1  7\n",
       "2  9\n",
       "3  8\n",
       "4  4"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dropna(axis=1) # 删除存在缺失值的列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "1  6.0  NaN  7\n",
       "2  NaN  3.0  9\n",
       "3  4.0  9.0  8\n",
       "4  NaN  5.0  4"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dropna(axis=1,how='all')  # 当列中的数据都为空时，才删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B  C\n",
       "0  2.0  5\n",
       "1  NaN  7\n",
       "2  3.0  9\n",
       "3  9.0  8\n",
       "4  5.0  4"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dropna(axis = 1,thresh = 4) # 每一列的非空值个数>=4，否则删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B  C\n",
       "0  2.0  5\n",
       "1  NaN  7\n",
       "2  3.0  9\n",
       "3  9.0  8\n",
       "4  5.0  4"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dropna(axis = 1,thresh = 4, inplace = True)  # 在原数据上操作\n",
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.3 缺失值填补\n",
    "你可能不想滤除缺失数据（有可能会丢弃跟它有关的其他数据），而是希望通过其他方式填补那些“空洞”。对于大多数情况而言，fillna方法是最主要的函数。通过一个常数调用fillna就会将缺失值替换为那个常数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     A    B  C\n",
      "0  1.0  2.0  5\n",
      "1  6.0  NaN  7\n",
      "2  NaN  3.0  9\n",
      "3  4.0  9.0  8\n",
      "4  NaN  5.0  4\n",
      "==========================\n",
      "     A    B  C\n",
      "0  1.0  2.0  5\n",
      "1  6.0  0.0  7\n",
      "2  0.0  3.0  9\n",
      "3  4.0  9.0  8\n",
      "4  0.0  5.0  4\n"
     ]
    }
   ],
   "source": [
    "# fillna()函数可以通过几种方法用非空数据“填充”NA值\n",
    "# fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)\n",
    "# value：用于填充缺失值的标量值或字典对象\n",
    "# method：插值方式。如果函数调用时未指定其他参数的话，默认为‘ffill’\n",
    "# axis：待填充的轴，默认为0\n",
    "# inplace：修改调用者对象而不产生副本\n",
    "# limit：（对于前向和后向填充）可以连续填充的最大数量\n",
    "\n",
    "# 用标量数据填充缺失值\n",
    "data = pd.DataFrame({'A':[1,6,np.nan,4,np.nan],'B':[2,np.nan,3,9,5],'C':[5,7,9,8,4]})\n",
    "print(data)\n",
    "print('==========================')\n",
    "print(data.fillna(0))  # 使用0来填充缺少值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.00</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>4.75</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.666667</td>\n",
       "      <td>3.00</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>9.00</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.666667</td>\n",
       "      <td>5.00</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          A     B  C\n",
       "0  1.000000  2.00  5\n",
       "1  6.000000  4.75  7\n",
       "2  3.666667  3.00  9\n",
       "3  4.000000  9.00  8\n",
       "4  3.666667  5.00  4"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(data.mean())  # 用均值来填补缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>0.4</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "1  6.0  0.4  7\n",
       "2  0.5  3.0  9\n",
       "3  4.0  9.0  8\n",
       "4  0.5  5.0  4"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 若是通过一个字典调用fillna，就可以实现对不同的列填充不同的值\n",
    "data.fillna(value = {'A':0.5,'B':0.4})  # 用0.5来填补A列的空值，0.4来填补B列的空值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "1  6.0  2.0  7\n",
       "2  6.0  3.0  9\n",
       "3  4.0  9.0  8\n",
       "4  4.0  5.0  4"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用填充的概念，来填补缺失的值\n",
    "# pad/fill   填充方法向前\n",
    "# bfill/backfill      填充方法向后\n",
    "\n",
    "data.fillna(method='pad')  # 将缺失值按照前面一个值进行填充。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B  C\n",
       "0  1.0  2.0  5\n",
       "1  6.0  3.0  7\n",
       "2  4.0  3.0  9\n",
       "3  4.0  9.0  8\n",
       "4  NaN  5.0  4"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(method='bfill') # 将缺失值按照后面一个值进行填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>9.0</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B    C\n",
       "0  1.0  2.0  5.0\n",
       "1  6.0  7.0  7.0\n",
       "2  3.0  3.0  9.0\n",
       "3  4.0  9.0  8.0\n",
       "4  5.0  5.0  4.0"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.fillna(axis=1,method='bfill')  # 修改轴方向，用后面列的值来填充"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     A    B  C\n",
      "0  1.0  2.0  5\n",
      "1  6.0  NaN  7\n",
      "2  NaN  3.0  9\n",
      "3  NaN  9.0  8\n",
      "4  NaN  5.0  4\n",
      "==================\n",
      "     A    B  C\n",
      "0  1.0  2.0  5\n",
      "1  6.0  2.0  7\n",
      "2  6.0  3.0  9\n",
      "3  NaN  9.0  8\n",
      "4  NaN  5.0  4\n"
     ]
    }
   ],
   "source": [
    "# limit 限制填充个数\n",
    "df = pd.DataFrame({'A':[1,6,np.nan,np.nan,np.nan],'B':[2,np.nan,3,9,5],'C':[5,7,9,8,4]})\n",
    "print(df)\n",
    "print('==================')\n",
    "print(df.fillna(method='pad',limit=1))  # 限制向前填充个数为1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.4 数据替换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one   two\n",
       "0   10  1000\n",
       "1   20   100\n",
       "2   30    30\n",
       "3   40    40\n",
       "4   50    50"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# replace（self，to_replace = None，value = None，inplace = False，limit = None，regex = False，method ='pad' ）\n",
    "# 将to_replace替换成value\n",
    "# to_replace：被替换的值\n",
    "# value：用于替换的值，可以是标量，字典，列表等\n",
    "# inplace：如果为True，在原数据上操作；默认为False\n",
    "# limit：向前或向后填充的最大间隔\n",
    "\n",
    "df = pd.DataFrame({'one':[10,20,30,40,50],\n",
    "                   'two':[1000,0,30,40,50]})\n",
    "df.replace(0,100) # 将0替换成100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>666</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one  two\n",
       "0   10  888\n",
       "1   20  666\n",
       "2   30   30\n",
       "3   40   40\n",
       "4   50   50"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用字典形式来替换多个数值\n",
    "# 字典的key为原值，value为替换后的值\n",
    "df.replace({0:666,1000:888})  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>666</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   one   two\n",
       "0   10  1000\n",
       "1   20   666\n",
       "2   30    30\n",
       "3   40    40\n",
       "4    5     5"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 也可以用列表的形式替换多个数值\n",
    "# 传入两个列表，第一个列表中的值为原值，第二列表中的值为替换值\n",
    "df.replace([0,50],[666,5]) # 用666来替换0；5替换50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>A</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>B</td>\n",
       "      <td>B</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  one   two\n",
       "0  10  1000\n",
       "1  20     A\n",
       "2  30    30\n",
       "3  40    40\n",
       "4   B     B"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.replace([0,50],['A','B'],inplace = True)  # 在原数据上修改\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one</th>\n",
       "      <th>two</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>N</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>N</td>\n",
       "      <td>N</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  one   two\n",
       "0  10  1000\n",
       "1  20     N\n",
       "2  30    30\n",
       "3  40    40\n",
       "4   N     N"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用正则表达式来替换\n",
    "# 注意，在使用正则表达式替换时，必须将regex设置为True\n",
    "df.replace(r'[A-Z]','N',regex=True)  # 将所有大写英文替换成N"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. pandas2新功能"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.1 Groupby的命名聚合\n",
    "可以直接为指定的聚合输出列命名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>品种</th>\n",
       "      <th>身高</th>\n",
       "      <th>体重</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>猫</td>\n",
       "      <td>9.1</td>\n",
       "      <td>7.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>狗</td>\n",
       "      <td>6.0</td>\n",
       "      <td>7.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>猫</td>\n",
       "      <td>9.5</td>\n",
       "      <td>9.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>狗</td>\n",
       "      <td>34.0</td>\n",
       "      <td>198.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  品种    身高     体重\n",
       "0  猫   9.1    7.9\n",
       "1  狗   6.0    7.5\n",
       "2  猫   9.5    9.9\n",
       "3  狗  34.0  198.0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 创建样例数据\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "animals = pd.DataFrame({'品种':['猫','狗','猫','狗'],\n",
    "                       '身高':[9.1,6.0,9.5,34.0],\n",
    "                       '体重':[7.9,7.5,9.9,198.0]})\n",
    "animals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在Pandas2中，命名聚合支持中文变量名，不过在平时的代码书写中，建议还是使用英文变量名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>最低</th>\n",
       "      <th>最高</th>\n",
       "      <th>平均体重</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>品种</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>狗</th>\n",
       "      <td>6.0</td>\n",
       "      <td>34.0</td>\n",
       "      <td>102.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>猫</th>\n",
       "      <td>9.1</td>\n",
       "      <td>9.5</td>\n",
       "      <td>8.90</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     最低    最高    平均体重\n",
       "品种                   \n",
       "狗   6.0  34.0  102.75\n",
       "猫   9.1   9.5    8.90"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "animals.groupby('品种').agg(\n",
    "    最低 = pd.NamedAgg(column='身高',aggfunc='min'),\n",
    "    最高 = pd.NamedAgg(column='身高',aggfunc='max'),\n",
    "    平均体重 = pd.NamedAgg(column='体重',aggfunc=np.mean)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的写法看起来还是有点繁琐，我们可以使用更简单的写法，只需传递一个Tuple就可以了，在Tuple的第一个元素是指定列，第二个元素是聚合函数，具体如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>最低</th>\n",
       "      <th>最高</th>\n",
       "      <th>平均体重</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>品种</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>狗</th>\n",
       "      <td>6.0</td>\n",
       "      <td>34.0</td>\n",
       "      <td>102.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>猫</th>\n",
       "      <td>9.1</td>\n",
       "      <td>9.5</td>\n",
       "      <td>8.90</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     最低    最高    平均体重\n",
       "品种                   \n",
       "狗   6.0  34.0  102.75\n",
       "猫   9.1   9.5    8.90"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "animals.groupby('品种').agg(\n",
    "    最低 = ('身高',min),\n",
    "    最高 = ('身高',max),\n",
    "    平均体重 = ('体重',np.mean)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.2 Groupby聚合支持多个lambda函数\n",
    "以 list 方式向 agg() 函数传递多个 lambda 函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>&lt;lambda_0&gt;</th>\n",
       "      <th>&lt;lambda_1&gt;</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>品种</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>狗</th>\n",
       "      <td>6.0</td>\n",
       "      <td>34.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>猫</th>\n",
       "      <td>9.1</td>\n",
       "      <td>9.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    <lambda_0>  <lambda_1>\n",
       "品种                        \n",
       "狗          6.0        34.0\n",
       "猫          9.1         9.5"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "animals.groupby('品种').身高.agg([\n",
    "       lambda x:x.iloc[0],lambda x: x.iloc[-1]\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">身高</th>\n",
       "      <th colspan=\"2\" halign=\"left\">体重</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>&lt;lambda_0&gt;</th>\n",
       "      <th>&lt;lambda_1&gt;</th>\n",
       "      <th>&lt;lambda_0&gt;</th>\n",
       "      <th>&lt;lambda_1&gt;</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>品种</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>狗</th>\n",
       "      <td>-28.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>-190.5</td>\n",
       "      <td>205.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>猫</th>\n",
       "      <td>-0.4</td>\n",
       "      <td>18.6</td>\n",
       "      <td>-2.0</td>\n",
       "      <td>17.8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           身高                    体重           \n",
       "   <lambda_0> <lambda_1> <lambda_0> <lambda_1>\n",
       "品种                                            \n",
       "狗       -28.0       40.0     -190.5      205.5\n",
       "猫        -0.4       18.6       -2.0       17.8"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "animals.groupby('品种').agg([\n",
    "    lambda x: x.iloc[0] - x.iloc[1],\n",
    "    lambda x: x.iloc[0] + x.iloc[1]\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个功能也有个小遗憾，多 lambda 函数的输出没有像命名聚合那样可以自定义命名，还要后面手动修改，有些不方便"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.3 优化了MultiIndex显示输出"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MultiIndex 输出的每行数据以 Tuple 显示，且垂直对齐，这样一来，MultiIndex 的结构显示的更清晰了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultiIndex([(  'a',   0),\n",
       "            (  'a',   1),\n",
       "            (  'a',   2),\n",
       "            (  'a',   3),\n",
       "            (  'a',   4),\n",
       "            (  'a',   5),\n",
       "            (  'a',   6),\n",
       "            (  'a',   7),\n",
       "            (  'a',   8),\n",
       "            (  'a',   9),\n",
       "            ...\n",
       "            ('abc', 490),\n",
       "            ('abc', 491),\n",
       "            ('abc', 492),\n",
       "            ('abc', 493),\n",
       "            ('abc', 494),\n",
       "            ('abc', 495),\n",
       "            ('abc', 496),\n",
       "            ('abc', 497),\n",
       "            ('abc', 498),\n",
       "            ('abc', 499)],\n",
       "           length=1000)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.MultiIndex.from_product([['a','abc'],range(500)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4 精简显示Series与DataFrame\n",
    "超过 60 行的 Series 与 DataFrame，pandas 会默认最多只显示 60 行（见 display.max_rows 选项）。这种设置依然会占用大量垂直屏幕空间。因此，0.25 版引入了 display.min_rows 选项，默认只显示 10 行：\n",
    "- 数据量小的 Series 与 DataFrame， 显示 max_row 行数据，默认为 60 行，前 30 行与后 30 行；\n",
    "- 数据量大的 Series 与 DataFrame，如果数据量超过 max_rows， 只显示 min_rows 行，默认为 10 行，即前 5 行与后 5 行。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Jupyter Notebook目前还不支持这个设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.5 json_normalize()支持max_level\n",
    "json_normalize() 支持按层级（level）读取，增加了 max_level 控制参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CreatedBy.Name</th>\n",
       "      <th>Lookup.TextField</th>\n",
       "      <th>Lookup.UserField</th>\n",
       "      <th>Image.a</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>User001</td>\n",
       "      <td>Some text</td>\n",
       "      <td>{'Id': 'ID001', 'Name': 'Name001'}</td>\n",
       "      <td>b</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  CreatedBy.Name Lookup.TextField                    Lookup.UserField Image.a\n",
       "0        User001        Some text  {'Id': 'ID001', 'Name': 'Name001'}       b"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from pandas.io.json import json_normalize\n",
    "\n",
    "data = [{\n",
    "        'CreatedBy': {'Name': 'User001'},\n",
    "        'Lookup': {'TextField': 'Some text',  \n",
    "                   'UserField': {'Id': 'ID001', 'Name': 'Name001'}},\n",
    "        'Image': {'a': 'b'}\n",
    "        }]\n",
    "json_normalize(data,max_level=1)  # 控制读取的JSON数据层级为1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.6 增加explode()方法，把list“炸”成行\n",
    "Series 与 DataFrame 增加了 explode() 方法，把 list 形式的值转换为单独的行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>变量1</th>\n",
       "      <th>变量2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a,b,c</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>d,e,f</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     变量1  变量2\n",
       "0  a,b,c    1\n",
       "1  d,e,f    2"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame([{'变量1': 'a,b,c', '变量2': 1},\n",
    "                   {'变量1': 'd,e,f', '变量2': 2}])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>变量1</th>\n",
       "      <th>变量2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>b</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>c</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>d</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>e</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>f</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  变量1  变量2\n",
       "0   a    1\n",
       "0   b    1\n",
       "0   c    1\n",
       "1   d    2\n",
       "1   e    2\n",
       "1   f    2"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.assign(变量1=df.变量1.str.split(',')).explode('变量1')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.7 SparseDataFrame已废弃\n",
    "0.25 以前专门有 SparseDataFrame()，生成稀疏矩阵，0.25 以后，这个函数被废弃了，改成 pd.DataFrame 里的 pd.SparseArray() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A\n",
       "0  0\n",
       "1  1"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame({\"A\":pd.SparseArray([0,1])})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.8 Groupby.apply的修改\n",
    "对 DataFrame Groupby 后，Groupby.apply 对每组只处理一次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x\n",
      "y\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>a</th>\n",
       "      <th>b</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>x</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>y</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   a  b\n",
       "0  x  1\n",
       "1  y  2"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'a':['x','y'],'b':[1,2]})\n",
    "def func(group):\n",
    "    print(group.name)\n",
    "    return group\n",
    "\n",
    "df.groupby('a').apply(func)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.9 Query()支持列名空格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data = [\n",
    "    {'姓 名': '张三', '城 市': '北京', '年 龄': 18},\n",
    "    {'姓 名': '李四', '城 市': '上海', '年 龄': 19, '爱 好': '打游戏'},\n",
    "    {'姓 名': '王五', '城 市': '广州', '年 龄': 20, '财务状况': '优'}\n",
    "]\n",
    "data = pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的 data 示例 DataFrame的列名是有空格的，现在用反引号(\\`)括住列名，就可以直接查询了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>姓 名</th>\n",
       "      <th>城 市</th>\n",
       "      <th>年 龄</th>\n",
       "      <th>爱 好</th>\n",
       "      <th>财务状况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>张三</td>\n",
       "      <td>北京</td>\n",
       "      <td>18</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  姓 名 城 市  年 龄  爱 好 财务状况\n",
       "0  张三  北京   18  NaN  NaN"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.query('`年 龄` < 19')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
